From c5a5c333b5b930ccc8d879067eddd874313f9574 Mon Sep 17 00:00:00 2001
From: Jacek Kowalski <Jacek@jacekk.info>
Date: Mon, 02 Nov 2020 20:25:34 +0000
Subject: [PATCH] [map] New API approach

---
 map.js     |  342 ++++-----
 /dev/null  | 1799 -------------------------------------------------
 lang_en.js |    4 
 lang_pl.js |    4 
 4 files changed, 152 insertions(+), 1,997 deletions(-)

diff --git a/lang_en.js b/lang_en.js
index bf8f333..79c8b42 100644
--- a/lang_en.js
+++ b/lang_en.js
@@ -50,8 +50,8 @@
 	
 	types: {
 		v: 'Vehicle',
-		b: 'Bus',
-		t: 'Tram',
+		vb: 'Bus',
+		vt: 'Tram',
 		s: 'Stop',
 		sb: 'Bus stop',
 		st: 'Tram stop',
diff --git a/lang_pl.js b/lang_pl.js
index 32b5aaf..a51190f 100644
--- a/lang_pl.js
+++ b/lang_pl.js
@@ -50,8 +50,8 @@
 	
 	types: {
 		'v': 'Pojazd',
-		'b': 'Autobus',
-		't': 'Tramwaj',
+		'vb': 'Autobus',
+		'vt': 'Tramwaj',
 		's': 'Przystanek',
 		'sb': 'Przystanek autobusowy',
 		'st': 'Przystanek tramwajowy',
diff --git a/map.js b/map.js
index 14cd19c..d957dbb 100644
--- a/map.js
+++ b/map.js
@@ -1,8 +1,7 @@
 'use strict';
 
 var api_refresh = 10000; // 10 seconds
-var api_poll_url = 'http://127.0.0.1/sub';
-var api_poll_refresh = 1000;
+var api_url = 'https://api.ttss.pl';
 
 var geolocation = null;
 var geolocation_set = 0;
@@ -15,7 +14,6 @@
 var vehicles = {};
 var hash = null;
 
-var stops_ignored = ['131', '744', '1263', '3039'];
 var stops_style = {
 	'sb': new ol.style.Style({
 		image: new ol.style.Circle({
@@ -54,7 +52,6 @@
 var stop_selected_source = null;
 var stop_selected_layer = null;
 
-var feature_clicked = null;
 var feature_xhr = null;
 var feature_timer = null;
 var path_xhr = null;
@@ -121,7 +118,9 @@
 	fail: function(message) {
 		addParaWithText(this._content, message).className = 'error';
 	},
-	show: function(contents, closeCallback) {
+	show: function(contents, closeCallback, hashValue) {
+		hash.set(hashValue ? hashValue : '');
+		
 		this._runCallback();
 		this.closeCallback = closeCallback;
 		
@@ -205,9 +204,7 @@
 		this.timeout = setTimeout(this.find.bind(this), 100);
 	},
 	open: function(panel) {
-		setHash('f');
-		
-		panel.show(this.div, this.close.bind(this));
+		panel.show(this.div, this.close.bind(this), 'f');
 		this.input.focus();
 	},
 	close: function() {
@@ -240,7 +237,7 @@
 	style: function(feature, clicked) {
 		var color_type = 'black';
 		
-		var vehicleType = vehicles_info.getParsed(feature.getId());
+		var vehicleType = feature.get('type');
 		if(vehicleType) {
 			switch(vehicleType.low) {
 				case 0:
@@ -277,12 +274,12 @@
 				// if(special_directions[vehicle.direction]) {
 				// 	vehicle.line = special_directions[vehicle.direction];
 				// }
-				text: feature.get('name').substr(0, feature.get('name').indexOf(' ')),
+				text: feature.get('line'),
 				fill: new ol.style.Fill({color: 'white'}),
 			}),
 		}));
 	},
-	select: function(feature, callback) {
+	select: function(feature) {
 		if(feature instanceof ol.Feature) {
 			feature = feature.getId();
 		}
@@ -294,20 +291,12 @@
 		this.style(feature, true);
 		
 		this.selectedFeatureId = feature.getId();
-		this.deselectCallback = callback;
 	},
 	deselect: function() {
 		if(!this.selectedFeatureId) return false;
 		var feature = this.source.getFeatureById(this.selectedFeatureId);
 		this.style(feature);
-		
-		this._internalDeselect();
-	},
-	_internalDeselect: function() {
-		var callback = this.deselectCallback;
-		this.deselectCallback = null;
 		this.selectedFeatureId = null;
-		if(callback) callback();
 	},
 
 	typesUpdated: function() {
@@ -317,20 +306,50 @@
 	},
 
 	_newFeature: function(id, data) {
-		var feature = new ol.Feature();
-		feature.setId(this.prefix + id);
-		feature.setProperties(data);
-		feature.setGeometry(getGeometryPair(feature.get('pos')));
+		var feature = new ol.Feature(data);
+		feature.set('_', 'v' + this.prefix);
+		feature.setId(id);
+		feature.setGeometry(getGeometryFeature(feature));
 		this.style(feature);
 		return feature;
 	},
+	_updateFeature: function(feature, vehicle) {
+		Object.keys(vehicle).forEach(function (key) {
+			feature.set(key, deepMerge(feature.get(key), vehicle[key]));
+			if(key === 'lon' || key === 'lat') {
+				feature.setGeometry(getGeometryFeature(feature));
+			} else if(key === 'angle') {
+				feature.getStyle().getImage().setRotation(Math.PI * parseFloat(vehicle.angle ? vehicle.angle : 0) / 180.0);
+			} else if(key === 'line') {
+				// TODO: Special directions
+				feature.getStyle().getText().setText(vehicle.line);
+			}
+		});
+	},
+	_removeFeature: function(feature) {
+		if(!feature) return;
+		this.source.removeFeature(feature);
+		if(this.selectedFeatureId === feature.getId()) {
+			this.deselect();
+		}
+	},
 	loadFullData: function(data) {
+		var self = this;
 		var features = [];
 		for(var id in data) {
-			features.push(this._newFeature(id, data[id]));
+			var feature = this.source.getFeatureById(id);
+			if(feature) {
+				this._updateFeature(feature, data[id]);
+			} else {
+				features.push(this._newFeature(id, data[id]));
+			}
 		}
-		this.source.clear();
 		this.source.addFeatures(features);
+		this.source.forEachFeature(function(feature) {
+			if(!data[feature.getId()]) {
+				self._removeFeature(feature);
+			}
+		});
 		
 		if(this.selectedFeatureId) {
 			this.select(this.selectedFeatureId);
@@ -338,31 +357,13 @@
 	},
 	loadDiffData: function(data) {
 		for(var id in data) {
-			var feature = this.source.getFeatureById(this.prefix + id);
+			var feature = this.source.getFeatureById(id);
 			var vehicle = data[id];
 			
-			// TODO: handle vehicleInfo updates
-			
 			if(vehicle === null) {
-				if(feature) {
-					this.source.removeFeature(feature);
-					if (this.selectedFeatureId === feature.getId()) {
-						this._internalDeselect();
-					}
-				}
+				this._removeFeature(feature);
 			} else if(feature) {
-				var isPosModified = false;
-				Object.keys(vehicle).forEach(function (key) {
-					feature.set(key, deepMerge(feature.get(key), vehicle[key]));
-					if(key === 'pos') {
-						feature.setGeometry(getGeometryPair(feature.get('pos')));
-					} else if (key === 'angle') {
-						feature.getStyle().getImage().setRotation(Math.PI * parseFloat(vehicle.angle ? vehicle.angle : 0) / 180.0);
-					} else if (key === 'name') {
-						// TODO: Special directions
-						feature.getStyle().getText().setText(vehicle.name.substr(0, vehicle.name.indexOf(' ')));
-					}
-				});
+				this._updateFeature(feature, vehicle);
 			} else {
 				this.source.addFeature(this._newFeature(id, data[id]));
 			}
@@ -371,48 +372,27 @@
 	
 	fetch: function() {
 		var self = this;
-		var result = this.fetchFull();
-
-		// TODO: XHR only as fallback
-		result.done(function() {
-			setTimeout(self.fetchDiff.bind(self), 1);
-		});
+		var result = this.fetchXhr();
 		
 		// TODO: updates (EventSource)
-		// TODO: error handling (reconnect)
+		// TODO: error ahandling (reconnect)
 		// TODO: error handling (indicator)
 		
 		return result;
 	},
-	fetchFull: function() {
+	fetchXhr: function() {
 		var self = this;
 		this.xhr = $.get(
-			api_poll_url + '?id=' + this.prefix + '-full'
+			api_url + '/positions/?type=' + this.prefix + '&last=' + this.lastUpdate
 		).done(function(data) {
 			try {
-				self.lastUpdate = this.request.getResponseHeader('Etag');
-				self.loadFullData(data);
-			} catch(e) {
-				console.log(e);
-				throw e;
-			}
-		}).fail(this.failXhr.bind(this));
-		return this.xhr;
-	},
-	fetchDiff: function() {
-		var self = this;
-		this.xhr = $.get(
-			api_poll_url + '?id=' + this.prefix + '-diff',
-			{'If-None-Match': this.lastUpdate}
-		).done(function(data) {
-			try {
-				if(this.request.status == 304) {
-					setTimeout(self.fetchDiff.bind(self), api_poll_refresh);
-					return;
+				if(data['type'] == 'full') {
+					self.loadFullData(data['pos']);
+				} else {
+					self.loadDiffData(data['pos']);
 				}
-				self.lastUpdate = this.request.getResponseHeader('Etag');
-				self.loadDiffData(data);
-				setTimeout(self.fetchDiff.bind(self), 1);
+				self.lastUpdate = data['last'];
+				setTimeout(self.fetchXhr.bind(self), api_refresh);
 			} catch(e) {
 				console.log(e);
 				throw e;
@@ -427,9 +407,9 @@
 		
 		if(result.status === 0) {
 			fail(lang.error_request_failed_connectivity, result);
-		} else if (result.status === 304) {
+		} else if(result.status === 304) {
 			fail(lang.error_request_failed_no_data, result);
-		} if (result.statusText) {
+		} else if(result.statusText) {
 			fail(lang.error_request_failed_status.replace('$status', result.statusText), result);
 		} else {
 			fail(lang.error_request_failed, result);
@@ -463,6 +443,9 @@
 	fail_ajax_generic(data, panel.fail.bind(panel));
 }
 
+function getGeometryFeature(feature) {
+	return getGeometryPair([feature.get('lon'), feature.get('lat')]);
+}
 function getGeometryPair(pair) {
 	return new ol.geom.Point(ol.proj.fromLonLat(pair));
 }
@@ -470,10 +453,10 @@
 	return getGeometryPair([object.longitude / 3600000.0, object.latitude / 3600000.0]);
 }
 
-function markStops(stops, ttss_type, routeStyle) {
+function markStops(stops, featureSource, routeStyle) {
 	stop_selected_source.clear();
 	
-	var style = stops_layer['s' + ttss_type].getStyle().clone();
+	var style = stops_layer['s' + featureSource].getStyle().clone();
 	
 	if(routeStyle) {
 		style.getImage().setRadius(5);
@@ -490,8 +473,7 @@
 		if(stops[i].getId) {
 			feature = stops[i];
 		} else {
-			prefix = stops[i].substr(0,2);
-			feature = stops_source[prefix].getFeatureById(stops[i]);
+			feature = stops_source['s' + featureSource].getFeatureById(stops[i]);
 		}
 		if(feature) {
 			stop_selected_source.addFeature(feature);
@@ -510,43 +492,29 @@
 }
 
 function updateStopSource(stops, prefix) {
-	var source = stops_source[prefix];
-	var mapping = stops_mapping[prefix];
 	var stop;
 	for(var i = 0; i < stops.length; i++) {
 		stop = stops[i];
 		
-		if(stop.category === 'other') continue;
-		if(stops_ignored.includes(stop.shortName)) continue;
+		var feature = new ol.Feature(stop);
+		feature.setId(stop.id);
+		feature.setGeometry(getGeometryFeature(feature));
 		
-		stop.geometry = getGeometry(stop);
-		var stop_feature = new ol.Feature(stop);
-		
-		if(prefix.startsWith('p')) {
-			mapping[stop.stopPoint] = stop_feature;
+		if(feature.get('parent') === null) {
+			feature.set('_', 's' + prefix);
+			stops_source['s' + prefix].addFeature(feature);
 		} else {
-			mapping[stop.shortName] = stop_feature;
+			feature.set('_', 'p' + prefix);
+			stops_source['p' + prefix].addFeature(feature);
 		}
-		
-		stop_feature.setId(prefix + stop.id);
-		
-		source.addFeature(stop_feature);
 	}
 }
 
-function updateStops(stop_type, ttss_type) {
-	var methods = {
-		's': 'stops',
-		'p': 'stopPoints',
-	};
+function updateStops(ttss_type) {
 	return $.get(
-		ttss_urls[ttss_type] + '/geoserviceDispatcher/services/stopinfo/' + methods[stop_type]
-			+ '?left=-648000000'
-			+ '&bottom=-324000000'
-			+ '&right=648000000'
-			+ '&top=324000000'
+		api_url + '/stops/?type=' + ttss_type
 	).done(function(data) {
-		updateStopSource(data[methods[stop_type]], stop_type + ttss_type);
+		updateStopSource(data, ttss_type);
 	}).fail(fail_ajax);
 }
 
@@ -584,41 +552,34 @@
 	if(feature_xhr) feature_xhr.abort();
 	if(feature_timer) clearTimeout(feature_timer);
 	
-	var featureId = feature.getId();
-	var ttss_type = featureId.substr(0, 1);
+	var featureDiscriminator = feature.get('_');
+	var featureType = featureDiscriminator.substr(0, 1);
+	var featureSource = featureDiscriminator.substr(1, 1);
+	var featureStatus = feature.get('status');
 	
 	feature_xhr = $.get(
-		ttss_urls[ttss_type] + '/services/tripInfo/tripPassages'
-			+ '?tripId=' + encodeURIComponent(feature.get('trip'))
-			+ '&mode=departure'
+		api_url + '/trip/?type=' + featureSource + '&id=' + feature.get('trip')
 	).done(function(data) {
-		if(typeof data.old === "undefined" || typeof data.actual === "undefined") {
-			return;
-		}
-		
 		deleteChildren(table);
 		
-		var all_departures = data.old.concat(data.actual);
 		var tr;
 		var stopsToMark = [];
-		for(var i = 0, il = all_departures.length; i < il; i++) {
+		for(var i = 0, il = data.length; i < il; i++) {
 			tr = document.createElement('tr');
-			addCellWithText(tr, all_departures[i].actualTime || all_departures[i].plannedTime);
-			addCellWithText(tr, all_departures[i].stop_seq_num + '. ' + normalizeName(all_departures[i].stop.name));
+			addCellWithText(tr, data[i].time);
+			addCellWithText(tr, (i+1) + '. ' + normalizeName(data[i].name));
 			
-			if(i >= data.old.length) {
-				stopsToMark.push('s' + ttss_type + all_departures[i].stop.id);
-			}
+			stopsToMark.push(data[i].stop);
 			
-			if(i < data.old.length) {
+			if(data[i].seq < feature.get('seq')) {
 				tr.className = 'active';
-			} else if(all_departures[i].status === 'STOPPING') {
+			} else if(data[i].seq == feature.get('seq') && featureStatus < 2) {
 				tr.className = 'success';
 			}
 			table.appendChild(tr);
 		}
 		
-		if(all_departures.length === 0) {
+		if(data.length === 0) {
 			tr = document.createElement('tr');
 			table.appendChild(tr);
 			tr = addCellWithText(tr, lang.no_data);
@@ -626,21 +587,23 @@
 			tr.className = 'active';
 		}
 		
-		markStops(stopsToMark, ttss_type, true);
+		markStops(stopsToMark, featureSource, true);
 		
 		feature_timer = setTimeout(function() { vehicleTable(feature, table); }, api_refresh);
 	}).fail(fail_ajax_popup);
 	return feature_xhr;
 }
 
-function stopTable(stopType, stopId, table, ttss_type) {
+function stopTable(feature, table) {
 	if(feature_xhr) feature_xhr.abort();
 	if(feature_timer) clearTimeout(feature_timer);
 	
+	var featureDiscriminator = feature.get('_');
+	var featureType = featureDiscriminator.substr(0, 1);
+	var featureSource = featureDiscriminator.substr(1, 1);
+	
 	feature_xhr = $.get(
-		ttss_urls[ttss_type] + '/services/passageInfo/stopPassages/' + stopType
-			+ '?' + stopType + '=' + encodeURIComponent(stopId)
-			+ '&mode=departure'
+		api_url + '/stop/?type=' + featureSource + '&id=' + feature.getId()
 	).done(function(data) {
 		deleteChildren(table);
 		
@@ -650,7 +613,7 @@
 			tr = document.createElement('tr');
 			addCellWithText(tr, all_departures[i].patternText);
 			dir_cell = addCellWithText(tr, normalizeName(all_departures[i].direction));
-			vehicle = vehicles_info.getParsed(all_departures[i].vehicleId);
+			//vehicle = vehicles_info.getParsed(all_departures[i].vehicleId);
 			dir_cell.appendChild(displayVehicle(vehicle));
 			status = parseStatus(all_departures[i]);
 			status_cell = addCellWithText(tr, status);
@@ -672,13 +635,15 @@
 			table.appendChild(tr);
 		}
 		
-		feature_timer = setTimeout(function() { stopTable(stopType, stopId, table, ttss_type); }, api_refresh);
+		feature_timer = setTimeout(function() { stopTable(feature, table); }, api_refresh);
 	}).fail(fail_ajax_popup);
 	return feature_xhr;
 }
 
 function featureClicked(feature) {
-	if(feature && !feature.getId()) return;
+	if(!feature || !feature.getId() || !feature.get('_')) {
+		feature = null;
+	}
 	
 	unstyleSelectedFeatures();
 	
@@ -687,9 +652,13 @@
 		return;
 	}
 	
+	var featureDiscriminator = feature.get('_');
+	var featureType = featureDiscriminator.substr(0, 1);
+	var featureSource = featureDiscriminator.substr(1, 1);
+	
 	var div = document.createElement('div');
 	
-	var name = normalizeName(feature.get('name'));
+	var name = normalizeName(feature.get('name') ? feature.get('name') : feature.get('line') + ' ' + feature.get('dir'));
 	var additional;
 	var table = document.createElement('table');
 	var thead = document.createElement('thead');
@@ -699,24 +668,20 @@
 	
 	var tabular_data = true;
 	
-	var type = feature.getId().substr(0, 1);
-	var full_type = feature.getId().match(/^[a-z]+/)[0];
-	var typeName = lang.types[full_type];
+	var typeName = lang.types[featureDiscriminator];
 	if(typeof typeName === 'undefined') {
 		typeName = '';
 	}
 	
 	// Location
-	if(type == 'l') {
+	if(featureType == 'l') {
 		tabular_data = false;
 		name = typeName;
 		typeName = '';
 	}
 	// Vehicle
-	else if(ttss_types.includes(type)) {
-		vehicles[type].select(feature);
-		
-		var span = displayVehicle(feature.get('vehicle_type'));
+	else if(featureType == 'v') {
+		var span = displayVehicle(feature.get('type'));
 		
 		additional = document.createElement('p');
 		if(span.title) {
@@ -730,42 +695,41 @@
 		addElementWithText(thead, 'th', lang.header_stop);
 		
 		vehicleTable(feature, tbody);
-		vehiclePath(feature);
+		//vehiclePath(feature);
 	}
 	// Stop or stop point
-	else if(['s', 'p'].includes(type)) {
-		var ttss_type = feature.getId().substr(1, 1);
-		if(type == 's') {
+	else if(['s', 'p'].includes(featureType)) {
+		if(featureType == 's') {
 			var second_type = lang.departures_for_buses;
-			var mapping = stops_mapping['sb'];
+			var source = stops_source['sb'];
 			
-			if(ttss_type == 'b') {
+			if(featureSource == 'b') {
 				second_type = lang.departures_for_trams;
-				mapping = stops_mapping['st'];
+				source = stops_source['st'];
 			}
 			
-			stopTable('stop', feature.get('shortName'), tbody, ttss_type);
+			stopTable(feature, tbody);
 			
-			if(mapping[feature.get('shortName')]) {
+			var second = source.getFeatureById(feature.get('id'));
+			if(second) {
 				additional = document.createElement('p');
 				additional.className = 'small';
 				addElementWithText(additional, 'a', second_type).addEventListener(
 					'click',
 					function() {
-						featureClicked(mapping[feature.get('shortName')]);
+						featureClicked(second);
 					}
 				);
 			}
 		} else {
-			stopTable('stopPoint', feature.get('stopPoint'), tbody, ttss_type);
+			stopTable(feature, tbody);
 			
 			additional = document.createElement('p');
 			additional.className = 'small';
 			addElementWithText(additional, 'a', lang.departures_for_stop).addEventListener(
 				'click',
 				function() {
-					var mapping = stops_mapping['s' + ttss_type];
-					featureClicked(mapping[feature.get('shortName')]);
+					featureClicked(stops_source['s' + featureSource].getFeatureById(feature.get('parent')));
 				}
 			);
 		}
@@ -774,8 +738,6 @@
 		addElementWithText(thead, 'th', lang.header_direction);
 		addElementWithText(thead, 'th', lang.header_time);
 		addElementWithText(thead, 'th', lang.header_delay);
-		
-		markStops([feature], feature.getId().substr(1,1));
 	} else {
 		panel.close();
 		return;
@@ -806,22 +768,23 @@
 	
 	if(tabular_data) {
 		div.appendChild(table);
-		hash.set(feature.getId());
 	}
 	
 	showOnMapFunction();
 	
 	panel.show(div, function() {
-		hash.set('');
-		
 		unstyleSelectedFeatures();
 		
 		if(path_xhr) path_xhr.abort();
 		if(feature_xhr) feature_xhr.abort();
 		if(feature_timer) clearTimeout(feature_timer);
-	});
+	}, tabular_data ? featureDiscriminator + feature.getId() : '');
 	
-	feature_clicked = feature;
+	if(featureType == 'v') {
+		vehicles[featureSource].select(feature);
+	} else if(['s', 'p'].includes(featureType)) {
+		markStops([feature], featureSource);
+	}
 }
 
 function listFeatures(features) {
@@ -834,7 +797,7 @@
 	
 	addParaWithText(div, lang.select_feature);
 	
-	var feature, p, a, full_type, typeName;
+	var feature, p, a, featureDiscriminator, typeName;
 	for(var i = 0; i < features.length; i++) {
 		feature = features[i];
 		
@@ -845,18 +808,18 @@
 			featureClicked(feature);
 		}}(feature));
 		
-		full_type = feature.getId().match(/^[a-z]+/)[0];
-		typeName = lang.types[full_type];
+		featureDiscriminator = feature.get('_');
+		typeName = lang.types[featureDiscriminator];
 		if(typeof typeName === 'undefined') {
 			typeName = '';
 		}
-		if(feature.get('vehicle_type')) {
-			typeName += ' ' + feature.get('vehicle_type').num;
+		if(feature.get('type')) {
+			typeName += ' ' + feature.get('type').num;
 		}
 		
 		addElementWithText(a, 'span', typeName).className = 'small';
 		a.appendChild(document.createTextNode(' '));
-		addElementWithText(a, 'span', normalizeName(feature.get('name')));
+		addElementWithText(a, 'span', normalizeName(feature.get('name') ? feature.get('name') : feature.get('line') + ' ' + feature.get('dir')));
 		
 		div.appendChild(p);
 	}
@@ -938,20 +901,18 @@
 		return false;
 	},
 	_updateOld: function() {
-		if(window.location.hash.match(/^#!t[0-9]{3}$/)) {
-			this.go(depotIdToVehicleId(window.location.hash.substr(3), 't'));
-		} else if(window.location.hash.match(/^#!b[0-9]{3}$/)) {
-			this.go(depotIdToVehicleId(window.location.hash.substr(3), 'b'));
-		} else if(window.location.hash.match(/^#![A-Za-z]{2}[0-9]{3}$/)) {
-			this.go(depotIdToVehicleId(window.location.hash.substr(2)));
-		} else if(window.location.hash.match(/^#!v-?[0-9]+$/)) {
-			this.go('t' + window.location.hash.substr(3));
+		if(window.location.hash.match(/^#![bt][0-9]{3}$/)) {
+			this.go('v' + window.location.hash.substr(2));
+		} else if(window.location.hash.match(/^#![RHrh][A-Za-z][0-9]{3}$/)) {
+			this.go('vt'+ window.location.hash.substr(4));
+		} else if(window.location.hash.match(/^#![BDPbdp][A-Za-z][0-9]{3}$/)) {
+			this.go('vb'+ window.location.hash.substr(4));
 		}
 	},
 	ready: function() {
 		this._updateOld();
 		this.changed();
-		window.addEventListener('hashchange', this.changed, false);
+		window.addEventListener('hashchange', this.changed.bind(this), false);
 	},
 	go: function(id) {
 		this._ignoreChange = false;
@@ -968,14 +929,13 @@
 		}
 		
 		var feature = null;
+		var source = null;
 		var vehicleId = null;
 		var stopId = null;
 		
-		if(window.location.hash.match(/^#![tb]-?[0-9]+$/)) {
-			vehicleId = window.location.hash.substr(2);
-		} else if(window.location.hash.match(/^#![sp]-?[0-9]+$/)) {
-			stopId = window.location.hash.substr(2,1) + 't' + window.location.hash.substr(3);
-		} else if(window.location.hash.match(/^#![sp][tb]-?[0-9]+$/)) {
+		if(window.location.hash.match(/^#!v[tb][0-9]+$/)) {
+			vehicleId = window.location.hash.substr(3);
+		} else if(window.location.hash.match(/^#![sp][tb][0-9a-z_]+$/)) {
 			stopId = window.location.hash.substr(2);
 		} else if(window.location.hash.match(/^#!f$/)) {
 			find.open(panel);
@@ -983,10 +943,9 @@
 		}
 		
 		if(vehicleId) {
-			vehicles[vehicleId.substr(0, 1)].select(vehicleId);
-			return true;
+			feature = vehicles[vehicleId.substr(0,1)].source.getFeatureById(vehicleId.substr(1));
 		} else if(stopId) {
-			feature = stops_source[stopId.substr(0,2)].getFeatureById(stopId);
+			feature = stops_source[stopId.substr(0,2)].getFeatureById(stopId.substr(2));
 		}
 		
 		featureClicked(feature);
@@ -1179,15 +1138,10 @@
 	map.getView().on('change:resolution', change_resolution);
 	change_resolution();
 	
-	var future_requests = [
-		vehicles_info.update(),
-	];
+	var future_requests = [];
 	ttss_types.forEach(function(type) {
-		vehicles_info.addWatcher(vehicles[type].typesUpdated.bind(vehicles[type]));
 		future_requests.push(vehicles[type].fetch());
-	});
-	stops_type.forEach(function(type) {
-		future_requests.push(updateStops(type.substr(0,1), type.substr(1,1)));
+		future_requests.push(updateStops(type));
 	});
 	
 	hash = new Hash();
diff --git a/proxy_bus.php b/proxy_bus.php
deleted file mode 100644
index 6486943..0000000
--- a/proxy_bus.php
+++ /dev/null
@@ -1,3 +0,0 @@
-<?php
-$base_proxy = 'http://ttss.mpk.krakow.pl/internetservice';
-require('proxy_common.php');
diff --git a/proxy_common.php b/proxy_common.php
deleted file mode 100644
index cbc5350..0000000
--- a/proxy_common.php
+++ /dev/null
@@ -1,121 +0,0 @@
-<?php
-if(!isset($base_proxy)) {
-	echo 'This script is for inclusion only.';
-	die();
-}
-
-function is_number($str) {
-	$str = (string)$str;
-
-	return
-		ctype_digit($str)
-		OR
-		(
-			substr($str, 0, 1) == '-'
-			AND
-			ctype_digit(substr($str, 1))
-		);
-}
-
-$method = [
-	'/services/lookup/autocomplete/json' => [
-		'query' => function() { return TRUE; },
-	],
-	'/services/passageInfo/stopPassages/stop' => [
-		'stop' => 'ctype_alnum',
-		'mode' => function($mode) { return in_array($mode, ['arrival', 'departure']); },
-		#'startTime' => 'ctype_digit',
-		#'timeFrame' => 'ctype_digit',
-	],
-	'/services/passageInfo/stopPassages/stopPoint' => [
-		'stopPoint' => 'is_number',
-		'mode' => function($mode) { return in_array($mode, ['arrival', 'departure']); },
-		#'startTime' => 'ctype_digit',
-		#'timeFrame' => 'ctype_digit',
-	],
-	'/services/tripInfo/tripPassages' => [
-		'tripId' => 'ctype_digit',
-		'mode' => function($mode) { return in_array($mode, ['arrival', 'departure']); },
-		#'vehicleId' => 'ctype_digit',
-	],
-	'/services/routeInfo/routeStops' => [
-		'routeId' => 'ctype_alnum',
-	],
-	'/services/stopInfo/stop' => [
-		'stop' => 'is_number',
-	],
-	'/services/stopInfo/stopPoint' => [
-		'stopPoint' => 'is_number',
-	],
-	
-	'/geoserviceDispatcher/services/stopinfo/stops' => [
-		'left' => 'is_number',
-		'bottom' => 'is_number',
-		'right' => 'is_number',
-		'top' => 'is_number',
-	],
-	'/geoserviceDispatcher/services/stopinfo/stopPoints' => [
-		'left' => 'is_number',
-		'bottom' => 'is_number',
-		'right' => 'is_number',
-		'top' => 'is_number',
-	],
-	'/geoserviceDispatcher/services/pathinfo/route' => [
-		'id' => 'is_number',
-		'direction' => 'is_number',
-	],
-	'/geoserviceDispatcher/services/pathinfo/vehicle' => [
-		'id' => 'is_number',
-	],
-	'/geoserviceDispatcher/services/vehicleinfo/vehicles' => [
-		'lastUpdate' => 'ctype_digit',
-		'positionType' => function($type) { return in_array($type, ['CORRECTED', 'RAW']); },
-		'colorType' => function($type) { return in_array($type, ['ROUTE_BASED']); },
-	],
-];
-$rewrite = [
-	'/lookup/autocomplete/json' => '/services/lookup/autocomplete/json',
-	'/passageInfo/stopPassages/stop' => '/services/passageInfo/stopPassages/stop',
-	'/routeInfo/routeStops' => '/services/routeInfo/routeStops',
-	'/internetservice/geoserviceDispatcher/services/pathinfo/vehicle' => '/geoserviceDispatcher/services/pathinfo/vehicle',
-];
-
-$path = $_SERVER['PATH_INFO'];
-
-if(isset($rewrite[$path])) {
-	$path = $rewrite[$path];
-}
-
-if(!isset($method[$path])) {
-	header('HTTP/1.1 403 Forbidden');
-	die('Forbidden');
-}
-
-$parameters = [];
-
-foreach($method[$path] as $name => $filter) {
-	if(!isset($_GET[$name])) {
-		header('HTTP/1.1 403 Forbidden');
-		die('Parameter '.$name.' is required');
-	}
-	
-	if(!$filter($_GET[$name])) {
-		header('HTTP/1.1 403 Forbidden');
-		die('Parameter '.$name.' has invalid value');
-	}
-	
-	$parameters[$name] = $_GET[$name];
-}
-
-$result = @file_get_contents($base_proxy . $path . '?' . http_build_query($parameters));
-if(!$result OR $http_response_header[0] != 'HTTP/1.1 200 OK') {
-	header('HTTP/1.1 503 Service Unavailable');
-	if(isset($http_response_header[0])) {
-		die($http_response_header[0]);
-	} else {
-		die('Unknown error');
-	}
-}
-
-header('Content-Type: application/json');
-echo $result;
diff --git a/proxy_tram.php b/proxy_tram.php
deleted file mode 100644
index 40e04ee..0000000
--- a/proxy_tram.php
+++ /dev/null
@@ -1,6 +0,0 @@
-<?php
-$base_proxy = 'http://www.ttss.krakow.pl/internetservice';
-if($_GET['positionType'] ?? NULL === 'RAW') {
-	$_GET['positionType'] = 'CORRECTED';
-}
-require('proxy_common.php');
diff --git a/stops.php b/stops.php
deleted file mode 100644
index 16eab82..0000000
--- a/stops.php
+++ /dev/null
@@ -1,77 +0,0 @@
-<?php
-include(__DIR__.'/stops/common.php');
-include(__DIR__.'/stops/stops.php');
-
-try {
-	// Reject invalid input
-	if(!isset($_GET['query'])) throw new UnexpectedValueException();
-	if(empty($_GET['query'])) throw new UnexpectedValueException();
-	if(strlen($_GET['query']) > 50) throw new UnexpectedValueException();
-	
-	// Initialize a DB connection an a query
-	$pdo = new PDO('sqlite:stops/stops.db', NULL, NULL, array(
-		PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
-	));
-	$st = $pdo->prepare('SELECT DISTINCT id FROM stop_search WHERE word LIKE ? AND id LIKE \'t%\'');
-	
-	// Split stop name into words
-	$words = split_stop_name($_GET['query']);
-	
-	// Find matching stops (their IDs)
-	$ids = NULL;
-	foreach($words as $word) {
-		if(empty($word)) continue;
-		
-		// Find stop IDs with names matching the word
-		$st->execute(array($word.'%'));
-		$results = $st->fetchAll(PDO::FETCH_COLUMN);
-		$st->closeCursor();
-		
-		if(is_array($ids)) {
-			// Merge results with list for previous words
-			$ids = array_intersect($ids, $results);
-		} else {
-			// First search - initialize results list
-			$ids = $results;
-		}
-		
-		// No results will be found
-		if(count($ids) == 0) break;
-	}
-	
-	// Close a DB connection
-	unset($st, $pdo);
-	
-	// No query was executed - return empty list
-	if(!is_array($ids)) throw new UnexpectedValueException();
-	
-	// Build a structure for the UI
-	$stop_list = [];
-	$query_lower = mb_strtolower($_GET['query'], 'UTF-8');
-	foreach($ids as $id) {
-		$stop_list[] = [
-			'id' => $id,
-			'name' => $stops[$id],
-			'type' => 'stop',
-			'relevance' => similar_text(
-				$query_lower,
-				mb_strtolower($stops[$id], 'UTF-8')
-			)
-		];
-	}
-	
-	// Sort stops by relevance
-	usort($stop_list, function($a, $b) {
-		$rel = $b['relevance'] - $a['relevance'];
-		if($rel == 0) return strcasecmp($a['name'], $b['name']);
-		return $rel;
-	});
-	
-	// Return JSON
-	echo json_encode($stop_list);
-} catch(UnexpectedValueException $e) {
-	echo '[]';
-} catch(Exception $e) {
-	header('HTTP/1.1 503 Service Unavailable');
-	echo $e->getMessage();
-}
diff --git a/stops/common.php b/stops/common.php
deleted file mode 100644
index 8cf4642..0000000
--- a/stops/common.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-setlocale(LC_CTYPE, 'pl_PL.UTF-8');
-
-function split_stop_name($string) {
-	$string = strtolower(iconv('utf-8', 'ascii//TRANSLIT', $string));
-	$words = preg_split('/\\W+/', $string);
-	
-	foreach($words as &$word) {
-		$two = substr($word, 0, 2);
-		if($two == 'os') $word = 'os';
-		elseif($two == 'al') $word = 'al';
-		elseif($two == 'sw') $word = 'sw';
-	}
-	unset($word);
-	
-	return array_values($words);
-}
-
-function normalize_name($string) {
-	return strtr(strtr($string, ['.' => '. ']), ['  ' => ' ']);
-}
-
-function normalize_name_cmp($string) {
-	return normalize_name(mb_strtolower($string, 'UTF-8'));
-}
diff --git a/stops/download_stops.php b/stops/download_stops.php
deleted file mode 100644
index 4c689b6..0000000
--- a/stops/download_stops.php
+++ /dev/null
@@ -1,30 +0,0 @@
-<?php
-if(php_sapi_name() !== 'cli') die();
-
-function fetchStops($url) {
-	$json = file_get_contents($url);
-	$elements = json_decode($json, 1);
-	$stops = [];
-	foreach($elements['stops'] as $element) {
-		if($element['category'] == 'other') continue;
-		$stops[$element['shortName']] = $element['name'];
-	}
-	asort($stops);
-	return $stops;
-}
-
-function printStops($stops, $prefix) {
-	foreach($stops as $id => $stop) {
-		echo '  \''.$prefix.str_pad($id."'", 5, ' ', STR_PAD_RIGHT).' => '.var_export($stop, TRUE).','."\n";
-	}
-}
-
-$stops_tram = fetchStops('http://www.ttss.krakow.pl/internetservice/geoserviceDispatcher/services/stopinfo/stops?left=-648000000&bottom=-324000000&right=648000000&top=324000000');
-$stops_bus = fetchStops('http://91.223.13.70/internetservice/geoserviceDispatcher/services/stopinfo/stops?left=-648000000&bottom=-324000000&right=648000000&top=324000000');
-
-echo '<?php'."\n";
-echo '$stops = array ('."\n";
-printStops($stops_tram, 't');
-echo "\n";
-printStops($stops_bus, 'b');
-echo ');'."\n";
diff --git a/stops/index.php b/stops/index.php
deleted file mode 100644
index eca9c39..0000000
--- a/stops/index.php
+++ /dev/null
@@ -1,87 +0,0 @@
-<?php
-include('common.php');
-include('stops.php');
-
-try {
-	// Reject invalid input
-	if(!isset($_GET['query'])) throw new UnexpectedValueException();
-	if(empty($_GET['query'])) throw new UnexpectedValueException();
-	if(strlen($_GET['query']) > 50) throw new UnexpectedValueException();
-	
-	// Split stop name into words
-	$words = split_stop_name($_GET['query']);
-	$find_ondemand = in_array('nz', $words);
-	
-	// Initialize a DB connection and a query
-	$pdo = new PDO('sqlite:stops.db', NULL, NULL, array(
-		PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
-	));
-	$st = $pdo->prepare('SELECT DISTINCT id FROM stop_search WHERE word LIKE ?'.($find_ondemand ? '' : ' AND word != \'nz\'').' ORDER BY id DESC');
-	
-	// Find matching stops (their IDs)
-	$ids = NULL;
-	foreach($words as $word) {
-		if(empty($word)) continue;
-		
-		// Find stop IDs with names matching the word
-		$st->execute(array($word.'%'));
-		$results = $st->fetchAll(PDO::FETCH_COLUMN);
-		$st->closeCursor();
-		
-		if(is_array($ids)) {
-			// Merge results with list for previous words
-			$ids = array_intersect($ids, $results);
-		} else {
-			// First search - initialize results list
-			$ids = $results;
-		}
-		
-		// No results will be found
-		if(count($ids) == 0) break;
-	}
-	
-	// Close a DB connection
-	unset($st, $pdo);
-	
-	// No query was executed - return empty list
-	if(!is_array($ids)) throw new UnexpectedValueException();
-	
-	// Build a structure for the UI
-	$stop_list = [];
-	$query_lower = normalize_name_cmp($_GET['query']);
-	foreach($ids as $id) {
-		$letters = similar_text(
-			$query_lower,
-			normalize_name_cmp($stops[$id]),
-			$percent
-		);
-		$percent += $letters * 100;
-		// -5 due to UTF-8
-		if(substr($stops[$id], -5) == '(nż)' && !$find_ondemand) {
-			$percent /= 2;
-		}
-		$stop_list[] = [
-			'id' => $id,
-			'name' => normalize_name($stops[$id]),
-			'type' => 'stop',
-			'relevance' => $percent,
-		];
-	}
-	
-	// Sort stops by relevance
-	usort($stop_list, function($a, $b) {
-		$rel = $b['relevance'] - $a['relevance'];
-		if($rel == 0) return strcasecmp($a['name'], $b['name']);
-		return $rel;
-	});
-	
-	// Return JSON
-	header('Content-Type: application/json');
-	echo json_encode($stop_list);
-} catch(UnexpectedValueException $e) {
-	header('Content-Type: application/json');
-	echo '[]';
-} catch(Exception $e) {
-	header('HTTP/1.1 503 Service Unavailable');
-	echo $e->getMessage();
-}
diff --git a/stops/populate_db.php b/stops/populate_db.php
deleted file mode 100644
index 845ec95..0000000
--- a/stops/populate_db.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-if(php_sapi_name() !== 'cli') die();
-
-include('stops.php');
-include('common.php');
-
-$pdo = new PDO('sqlite:stops_temp.db');
-
-$pdo->query('DROP TABLE IF EXISTS stop_search');
-$pdo->query('CREATE TABLE stop_search (
-	word VARCHAR(60),
-	id VARCHAR(255)
-)');
-
-function processStops($st, $stops) {
-	foreach($stops as $id => $name) {
-		foreach(split_stop_name($name) as $word) {
-			$st->execute([$word, $id]);
-			$st->closeCursor();
-		}
-	}
-}
-
-$pdo->beginTransaction();
-$st = $pdo->prepare('INSERT INTO stop_search (word, id) VALUES (?, ?)');
-processStops($st, $stops);
-$pdo->commit();
-
-$pdo->query('CREATE INDEX stop_search_word ON stop_search (word COLLATE NOCASE)');
-
-rename('stops_temp.db', 'stops.db');
diff --git a/stops/stops.db b/stops/stops.db
deleted file mode 100644
index dc53950..0000000
--- a/stops/stops.db
+++ /dev/null
Binary files differ
diff --git a/stops/stops.php b/stops/stops.php
deleted file mode 100644
index cb3baee..0000000
--- a/stops/stops.php
+++ /dev/null
@@ -1,1799 +0,0 @@
-<?php
-$stops = array (
-  't113'  => 'AWF',
-  't462'  => 'Agencja Kraków Wschód',
-# 't134'  => 'Balicka Wiadukt', # nowa nazwa # 't136'  => 'Bronowice Wiadukt',
-  't449'  => 'Bardosa',
-# 't75'   => 'Basztowa LOT', # nowa nazwa # 't3032' => 'Stary Kleparz',
-  't78'   => 'Batorego',
-  't130'  => 'Białucha',
-  't867'  => 'Bieńczycka',
-  't630'  => 'Bieżanowska',
-  't84'   => 'Biprostal',
-  't461'  => 'Blokowa',
-# 't2798' => 'Boisko Kabel', # dawny tymczasowy
-  't747'  => 'Borek Fałęcki',
-  't824'  => 'Borek Fałęcki I',
-  't612'  => 'Borsucza',
-  't451'  => 'Brama nr 4 (nż)',
-  't453'  => 'Brama nr 5 (nż)',
-  't61'   => 'Bratysławska',
-  't89'   => 'Bronowice',
-  't135'  => 'Bronowice Małe',
-  't136'  => 'Bronowice Wiadukt',
-  't613'  => 'Brożka (nż)',
-  't409'  => 'Centralna',
-# 't3039' => 'Centrum Kongresowe ICE', # nowa nazwa # 't3338' => 'Rondo Grunwaldzkie',
-  't2691' => 'Chmieleniec',
-  't87'   => 'Cichy Kącik',
-  't3037' => 'Cienista',
-# 't2549' => 'Cmentarz Grębałów Zachód', # nowa nazwa # 't2685' => 'Jarzębiny',
-  't621'  => 'Cmentarz Podgórski',
-  't124'  => 'Cmentarz Rakowicki',
-# 't318'  => 'Cracovia', # nowa nazwa # 't3141' => 'Muzeum Narodowe',
-  't129'  => 'Cystersów',
-  't3038' => 'Czerwone Maki P+R',
-  't407'  => 'Czyżyny',
-  't392'  => 'DH Wanda',
-  't915'  => 'Dajwór', # nieczynny - linia muzealna
-  't435'  => 'Darwina',
-  't632'  => 'Dauna',
-  't388'  => 'Dunikowskiego',
-  't623'  => 'Dworcowa',
-# 't131'  => 'Dworzec Główny', # nowa nazwa # 't3242' => 'Teatr Słowackiego',
-  't1173' => 'Dworzec Główny Tunel',
-# 't8567' => 'Dworzec Główny Tunel', # duplikat # 't1173' => 'Dworzec Główny Tunel',
-  't2608' => 'Dworzec Główny Zachód',
-  't2870' => 'Dworzec Płaszów Estakada',
-  't70'   => 'Dworzec Towarowy',
-# 't6685' => 'Dworzec Towarowy', # duplikat # 't70'   => 'Dworzec Towarowy',
-  't370'  => 'Dąbie',
-  't464'  => 'Elektromontaż (nż)',
-  't368'  => 'Fabryczna',
-  't322'  => 'Filharmonia',
-  't1051' => 'Fort Mogiła (nż)',
-  't367'  => 'Francesco Nullo',
-  't560'  => 'Gromadzka',
-# 't585'  => 'Grota Roweckiego', # nowa nazwa # 't2687' => 'Grota-Roweckiego',
-  't2687' => 'Grota-Roweckiego',
-  't1049' => 'Głowackiego',
-  't363'  => 'Hala Targowa',
-# 't6990' => 'Hala Targowa', # duplikat # 't363'  => 'Hala Targowa',
-  't2685' => 'Jarzębiny',
-  't452'  => 'Jeżynowa',
-  't319'  => 'Jubilat',
-  't624'  => 'Kabel',
-  't2690' => 'Kampus UJ',
-  't576'  => 'Kapelanka',
-  't429'  => 'Klasztorna',
-  't382'  => 'Kleeberga',
-  't946'  => 'Klimeckiego',
-  't584'  => 'Kobierzyńska',
-# 't401'  => 'Kocmyrzowska', # nowa nazwa # 't3037' => 'Cienista',
-  't457'  => 'Koksochemia (nż)',
-  't459'  => 'Kombinat',
-  't313'  => 'Komorowskiego',
-  't450'  => 'Kopiec Wandy',
-# 't2536' => 'Kordylewskiego', # nowa nazwa # 't2859' => 'Teatr Variété',
-  't571'  => 'Korona',
-# 't2803' => 'Kraków Arena Al. Pokoju', # nowa nazwa # 't2871' => 'TAURON Arena Kraków Al. Pokoju',
-# 't959'  => 'Kraków Plaza', # nowa nazwa # 't3033' => 'Plaza',
-  't63'   => 'Krowodrza Górka',
-# 't7612' => 'Krowodrza Górka', # duplikat # 't63'   => 'Krowodrza Górka',
-  't567'  => 'Kuklińskiego',
-# 't744'  => 'Kurdwanów', # nowa nazwa # 't3176' => 'Kurdwanów P+R',
-  't3176' => 'Kurdwanów P+R',
-# 't7389' => 'Kurdwanów pętla', # nowa nazwa # 't744'  => 'Kurdwanów',
-# 't2537' => 'Lema', # nowa nazwa # 't2803' => 'Kraków Arena Al. Pokoju'
-  't569'  => 'Limanowskiego',
-  't2686' => 'Lipińskiego',
-  't561'  => 'Lipska',
-  't126'  => 'Lubicz',
-  't930'  => 'M1 Al. Pokoju',
-# 't1263' => 'Mały Płaszów', # nowa nazwa # 't3310' => 'Mały Płaszów P+R',
-  't3310' => 'Mały Płaszów P+R',
-  't454'  => 'Meksyk (nż)',
-  't362'  => 'Miodowa',
-# 't6989' => 'Miodowa', # duplikat # 't362'  => 'Miodowa',
-  't375'  => 'Mistrzejowice',
-  't2538' => 'Miśnieńska',
-# 't574'  => 'Most Grunwaldzki', # nowa nazwa # 't3039' => 'Centrum Kongresowe ICE',
-  't460'  => 'Mrozowa',
-  't2726' => 'Muzeum Inżynierii Miejskiej', # nieczynny - linia muzealna
-  't2811' => 'Muzeum Lotnictwa',
-  't3141' => 'Muzeum Narodowe',
-  't2688' => 'Norymberska',
-# 't372'  => 'Nowohucka', # nowa nazwa # 't3041' => 'Rondo 308. Dywizjonu',
-  't715'  => 'Nowosądecka',
-# 't2580' => 'Nowy Bieżanów', # nowa nazwa # 't3175' => 'Nowy Bieżanów P+R',
-  't3175' => 'Nowy Bieżanów P+R',
-  't71'   => 'Nowy Kleparz',
-  't2582' => 'Nowy Prokocim',
-  't369'  => 'Ofiar Dąbia',
-  't823'  => 'Oleandry',
-  't361'  => 'Orzeszkowej',
-  't413'  => 'Os.Kolorowe',
-  't424'  => 'Os.Na Skarpie',
-  't378'  => 'Os.Piastów',
-  't418'  => 'Os.Zgody',
-  't377'  => 'Os.Złotego Wieku',
-  't466'  => 'PH',
-  't614'  => 'PT',
-  't960'  => 'Park Jordana',
-  't716'  => 'Piaski Nowe',
-  't379'  => 'Piasta Kołodzieja',
-  't570'  => 'Plac Bohaterów Getta',
-# 't7207' => 'Plac Bohaterów Getta', # duplikat # 't570'  => 'Plac Bohaterów Getta',
-# 't414'  => 'Plac Centralny', # nowa nazwa # 't2744' => 'Plac Centralny im. R.Reagana',
-  't2744' => 'Plac Centralny im. R.Reagana',
-  't79'   => 'Plac Inwalidów',
-  't360'  => 'Plac Wolnica', # nieczynny - przebudowa ul. Krakowskiej
-  't1360' => 'Plac Wszystkich Świętych',
-  't3033' => 'Plaza',
-  't458'  => 'Pleszów',
-  't357'  => 'Poczta Główna',
-  't3158' => 'Podgórze SKA',
-  't73'   => 'Politechnika',
-# 't6689' => 'Politechnika', # duplikat # 't73'   => 'Politechnika',
-# 't568'  => 'Powstańców Wielkopolskich', # nowa nazwa # 't3158' => 'Podgórze SKA',
-# 't7204' => 'Powstańców Wielkopolskich', # duplikat # 't568'  => 'Powstańców Wielkopolskich',
-  't637'  => 'Prokocim',
-# 't7279' => 'Prokocim', # duplikat # 't637'  => 'Prokocim',
-  't682'  => 'Prokocim Szpital',
-# 't69'   => 'Prądnicka', # nowa nazwa # 't3036' => 'Szpital Narutowicza',
-# 't6684' => 'Prądnicka', # duplikat # 't69'   => 'Prądnicka',
-  't72'   => 'Pędzichów',
-  't128'  => 'Rakowicka (nż)',
-  't320'  => 'Reymana',
-  't3041' => 'Rondo 308. Dywizjonu',
-  't408'  => 'Rondo Czyżyńskie',
-  't3338' => 'Rondo Grunwaldzkie',
-  't365'  => 'Rondo Grzegórzeckie',
-# 't6992' => 'Rondo Grzegórzeckie', # duplikat # 't365'  => 'Rondo Grzegórzeckie',
-  't2539' => 'Rondo Hipokratesa',
-# 't419'  => 'Rondo Kocmyrzowskie', # nowa nazwa # 't2745' => 'Rondo Kocmyrzowskie im. Ks. Gorzelanego',
-  't2745' => 'Rondo Kocmyrzowskie im. Ks. Gorzelanego',
-  't610'  => 'Rondo Matecznego',
-  't125'  => 'Rondo Mogilskie',
-# 't6747' => 'Rondo Mogilskie', # duplikat # 't125'  => 'Rondo Mogilskie',
-  't383'  => 'Rondo Piastowskie',
-# 't587'  => 'Rostworowskiego', # nowa nazwa # 't589'  => 'Ruczaj',
-  't589'  => 'Ruczaj',
-# 't586'  => 'Ruczaj I', # nowa nazwa # 't585'  => 'Grota Roweckiego',
-  't1262' => 'Rzebika',
-  't611'  => 'Rzemieślnicza',
-  't311'  => 'Salwator',
-  't615'  => 'Sanktuarium Bożego Miłosierdzia', # nieczynny - budowa Trasy Łagiewnickiej
-  't572'  => 'Smolki',
-  't746'  => 'Solvay',
-  't358'  => 'Starowiślna',
-# 't6985' => 'Starowiślna', # duplikat # 't358'  => 'Starowiślna',
-  't3032' => 'Stary Kleparz',
-  't112'  => 'Stella-Sawickiego',
-  't359'  => 'Stradom',
-  't423'  => 'Struga',
-  't2548' => 'Suche Stawy',
-  't3036' => 'Szpital Narutowicza',
-  't575'  => 'Szwedzka',
-  't577'  => 'Słomiana',
-  't2871' => 'TAURON Arena Kraków Al. Pokoju (nż)',
-  't3040' => 'TAURON Arena Kraków Wieczysta',
-  't77'   => 'Teatr Bagatela',
-  't420'  => 'Teatr Ludowy',
-  't3242' => 'Teatr Słowackiego',
-  't2859' => 'Teatr Variété',
-  't681'  => 'Teligi',
-  't127'  => 'Uniwersytet Ekonomiczny',
-  't321'  => 'Uniwersytet Jagielloński',
-  't88'   => 'Uniwersytet Pedagogiczny',
-  't83'   => 'Urzędnicza',
-  't463'  => 'Walcownia',
-  't325'  => 'Wawel',
-  't2543' => 'Wańkowicza',
-  't133'  => 'Wesele',
-  't434'  => 'Wiadukty',
-# 't114'  => 'Wieczysta', # nowa nazwa # 't3040' => 'TAURON Arena Kraków Wieczysta',
-  't718'  => 'Witosa',
-# 't7362' => 'Witosa', # duplikat # 't718'  => 'Witosa',
-  't634'  => 'Wlotowa',
-  't442'  => 'Wzgórza Krzesławickie',
-  't1154' => 'Zabłocie',
-  't465'  => 'Zajezdnia Nowa Huta',
-  't679'  => 'Ćwiklińskiej',
-  't922'  => 'Łagiewniki',
-# 't7584' => 'Łagiewniki', # duplikat # 't922'  => 'Łagiewniki',
-  't2821' => 'Łagiewniki ZUS',
-# 't324'  => 'Św. Gertrudy', # duplikat # 't2741' => 'Św.Gertrudy',
-# 't364'  => 'Św. Wawrzyńca', # duplikat # 't2742' => 'Św.Wawrzyńca',
-# 't8508' => 'Św. Wawrzyńca', # duplikat # 't364'  => 'Św. Wawrzyńca',
-  't2741' => 'Św.Gertrudy',
-  't2742' => 'Św.Wawrzyńca',
-
-  'b3111' => 'AGH / UR',
-  'b113'  => 'AWF',
-  'b1328' => 'Agatowa (nż)',
-  'b462'  => 'Agencja Kraków Wschód (nż)',
-  'b117'  => 'Akacjowa',
-  'b2573' => 'Albatrosów',
-  'b415'  => 'Aleja Przyjaźni',
-  'b416'  => 'Aleja Róż',
-  'b2625' => 'Aleja Waszyngtona (nż)',
-# 'b235'  => 'Aleksandrowice', # nowa nazwa # 'b3388' => 'Aleksandrowice Centrum',
-  'b3388' => 'Aleksandrowice Centrum',
-  'b236'  => 'Aleksandrowice Osiedle (nż)',
-  'b3150' => 'Aleksandrowicza (nż)',
-  'b1122' => 'Aleksandry',
-  'b437'  => 'Architektów',
-  'b3337' => 'Archiwum UMK (nż)',
-  'b403'  => 'Arka',
-  'b2533' => 'Armii Krajowej',
-  'b54'   => 'Azory',
-  'b145'  => 'Baba Jaga (nż)',
-  'b767'  => 'Babińskiego',
-  'b1083' => 'Baczyńskiego (nż)',
-  'b2565' => 'Bagienna',
-  'b2865' => 'Bagry',
-  'b221'  => 'Balice Autostrada (nż)',
-  'b2635' => 'Balice Grzybów (nż)',
-  'b226'  => 'Balice I (nż)',
-# 'b223'  => 'Balice Instytut (nż)', # nowa nazwa # 'b3385' => 'Balice Instytut Zootechniki (nż)',
-  'b3385' => 'Balice Instytut Zootechniki (nż)',
-  'b2636' => 'Balice Leśna (nż)',
-  'b3012' => 'Balice Medweckiego (nż)',
-# 'b892'  => 'Balice OSP (nż)', # nowa nazwa # 'b3415' => 'Balice Remiza (nż)',
-  'b3013' => 'Balice Olszanica Bory',
-  'b3415' => 'Balice Remiza (nż)',
-  'b222'  => 'Balice Szkoła',
-  'b2912' => 'Balice Winna Góra (nż)',
-  'b2796' => 'Banacha',
-  'b541'  => 'Bartnicza (nż)',
-  'b2551' => 'Barwna (nż)',
-  'b703'  => 'Barycz (nż)',
-  'b2528' => 'Batalionu \'Skała\' AK',
-  'b78'   => 'Batorego',
-  'b2962' => 'Batowice Dłubnia',
-  'b352'  => 'Batowice Kapliczka',
-  'b2959' => 'Batowice Spławy (nż)',
-  'b3121' => 'Bazarowa',
-  'b578'  => 'Bałuckiego (nż)',
-  'b2633' => 'Belwederczyków (nż)',
-  'b2518' => 'Benedyktowicza (nż)',
-  'b923'  => 'Beskidzka',
-  'b1271' => 'Białoprądnicka',
-  'b130'  => 'Białucha',
-  'b973'  => 'Biały Kościół (nż)',
-  'b330'  => 'Bibice (nż)',
-  'b2783' => 'Bibice Cmentarz (nż)',
-  'b2960' => 'Bibice Kościuszki',
-  'b3361' => 'Bibice Mokra',
-# 'b2995' => 'Bibice Na Czekaj', # nowa nazwa # 'b3361' => 'Bibice Mokra',
-  'b2961' => 'Bibice Rynek',
-  'b260'  => 'Bielany',
-  'b262'  => 'Bielany Klasztor (nż)',
-  'b3102' => 'Bielany Obwodnica (nż)',
-  'b261'  => 'Bielany Szkoła',
-  'b265'  => 'Bielańska (nż)',
-  'b272'  => 'Bielańskie Skały (nż)',
-  'b867'  => 'Bieńczycka',
-  'b630'  => 'Bieżanowska',
-  'b667'  => 'Bieżanów',
-  'b3183' => 'Bieżanów Drożdżownia SKA',
-  'b2725' => 'Bieżanów Granica Miasta',
-  'b672'  => 'Bieżanów Kaim',
-  'b665'  => 'Bieżanów Pomnik',
-  'b670'  => 'Bieżanów Potrzask',
-  'b663'  => 'Bieżanów Szkoła',
-  'b662'  => 'Bieżanów Trafo', # nieczynny - remont ul. Bieżanowskiej
-  'b84'   => 'Biprostal',
-  'b122'  => 'Biskupa Prandoty',
-# 'b3244' => 'Biskupia', # tymczasowy - przebudowa linii do Bronowic
-  'b3220' => 'Biskupice I (nż)',
-  'b3221' => 'Biskupice II (nż)',
-  'b2574' => 'Biskupińska (nż)',
-  'b461'  => 'Blokowa (nż)',
-  'b2597' => 'Bochenka (nż)',
-  'b34'   => 'Bociana',
-  'b3381' => 'Bodzów',
-  'b592'  => 'Bogucianka',
-  'b1258' => 'Bojki',
-# 'b208'  => 'Bolechowice', # nowa nazwa # 'b3413' => 'Bolechowice Centrum',
-  'b3413' => 'Bolechowice Centrum',
-  'b2917' => 'Bolechowice Drogi (nż)',
-  'b2916' => 'Bolechowice Krzewiny (nż)',
-  'b2915' => 'Bolechowice Zielona (nż)',
-  'b2920' => 'Bolechowice Zielona Mała (nż)',
-  'b2561' => 'Bolesława Śmiałego',
-  'b3210' => 'Boleń Pętla',
-  'b1255' => 'Bonarka',
-  'b810'  => 'Bora-Komorowskiego',
-  'b747'  => 'Borek Fałęcki',
-  'b1118' => 'Borek Szlachecki I (nż)',
-  'b1117' => 'Borek Szlachecki II (nż)',
-  'b753'  => 'Borkowska',
-  'b612'  => 'Borsucza',
-  'b2532' => 'Bosaków',
-# 'b1071' => 'Bosutów Dziekanowice (nż)', # nowa nazwa # 'b3442' => 'Węgrzce B1 (nż)',
-  'b2769' => 'Bosutów Krakowska (nż)',
-  'b3211' => 'Bosutów Remiza',
-  'b453'  => 'Brama nr 5 (nż)',
-  'b530'  => 'Branice (nż)',
-  'b513'  => 'Branice Na Dole (nż)',
-  'b2652' => 'Branice Ośrodek Zdrowia (nż)',
-  'b512'  => 'Branice Pagórek (nż)',
-  'b531'  => 'Branice Szkoła',
-  'b61'   => 'Bratysławska',
-  'b1165' => 'Brodowicza',
-  'b123'  => 'Brogi',
-  'b89'   => 'Bronowice',
-  'b135'  => 'Bronowice Małe',
-  'b136'  => 'Bronowice Wiadukt',
-  'b19'   => 'Bronowice Wielkie',
-# 'b638'  => 'Brzegi', # nowa nazwa # 'b3311' => 'Brzegi Pętla',
-  'b639'  => 'Brzegi I',
-  'b1294' => 'Brzegi III (nż)',
-  'b3311' => 'Brzegi Pętla',
-  'b3340' => 'Brzegi Użytek Ekologiczny (nż)',
-  'b2648' => 'Brzeska (nż)',
-  'b1016' => 'Brzezie Działki (nż)',
-  'b3209' => 'Brzezie Kluczwody (nż)',
-  'b3049' => 'Brzezie Kościół (nż)',
-  'b1048' => 'Brzezie Kulka (nż)',
-  'b1021' => 'Brzezie Narodowe (nż)',
-# 'b1028' => 'Brzezinka', # nowa nazwa # 'b3417' => 'Brzezinka Kościół',
-  'b3417' => 'Brzezinka Kościół',
-  'b3329' => 'Brzezinka Kuźnia (nż)',
-  'b1029' => 'Brzezinka Skrzyżowanie',
-  'b1027' => 'Brzezinka Zarzecze (nż)',
-# 'b1106' => 'Brzeźnica', # nowa nazwa # 'b3328' => 'Brzeźnica Dworzec',
-  'b3328' => 'Brzeźnica Dworzec',
-# 'b1109' => 'Brzeźnica Kuźnia (nż)', # nowa nazwa # 'b3329' => 'Brzezinka Kuźnia (nż)',
-  'b1108' => 'Brzeźnica Pasieka (nż)',
-  'b2695' => 'Brzoskwinia Góra (nż)',
-  'b240'  => 'Brzoskwinia Kamyk (nż)',
-  'b238'  => 'Brzoskwinia Koziary (nż)',
-  'b3201' => 'Brzoskwinia Pętla',
-  'b239'  => 'Brzoskwinia Sklep',
-  'b3271' => 'Brzozówka Oskarówka',
-  'b3272' => 'Brzozówka Ośrodek',
-  'b2708' => 'Brzyczyna',
-  'b765'  => 'Brücknera',
-  'b2780' => 'Budzyń Plaża Główna (nż)',
-  'b2781' => 'Budzyń Zalew Budzyński (nż)',
-  'b2779' => 'Budzyń Zalew na Piaskach (nż)',
-  'b743'  => 'Bujaka',
-# 'b881'  => 'Buków', # nowa nazwa # 'b3323' => 'Buków Pętla',
-  'b882'  => 'Buków Klin (nż)',
-  'b3323' => 'Buków Pętla',
-  'b883'  => 'Buków Szkoła (nż)',
-  'b432'  => 'Bulwarowa (nż)',
-  'b2603' => 'Bulwarowa Ogródki Działkowe (nż)',
-  'b1346' => 'Bunscha (nż)',
-# 'b2914' => 'Burów (nż)', # nowa nazwa # 'b3414' => 'Burów Balica (nż)',
-  'b3414' => 'Burów Balica (nż)',
-  'b2913' => 'Burów Centrum',
-  'b2627' => 'Bystronia (nż)',
-  'b978'  => 'Bębło Lasek (nż)',
-  'b976'  => 'Bębło Stara Wieś (nż)',
-  'b977'  => 'Bębło Łabajowa (nż)',
-  'b982'  => 'Będkowice',
-  'b981'  => 'Będkowice Borynia (nż)',
-  'b3007' => 'Będkowice Cmentarz (nż)',
-  'b2869' => 'Będkowice Długa (nż)',
-  'b980'  => 'Będkowice Kawiory (nż)',
-  'b979'  => 'Będkowice Mosurowa (nż)',
-  'b2700' => 'Będkowice Pętla',
-  'b505'  => 'Błonia Kościelnickie (nż)',
-  'b2595' => 'Cechowa (nż)',
-  'b385'  => 'Cedyńska',
-  'b409'  => 'Centralna',
-  'b2453' => 'Centrum JP II',
-# 'b3039' => 'Centrum Kongresowe ICE', # nowa nazwa # 'b3338' => 'Rondo Grunwaldzkie',
-  'b40'   => 'Chabrowa',
-  'b728'  => 'Chałubińskiego (nż)',
-  'b525'  => 'Chałupki',
-  'b2651' => 'Chałupki Górne (nż)',
-  'b151'  => 'Chełm',
-  'b3073' => 'Chełmońskiego Osiedle',
-  'b3072' => 'Chełmońskiego Pętla',
-  'b152'  => 'Chełmska (nż)',
-  'b2691' => 'Chmieleniec',
-  'b1274' => 'Chobot (nż)',
-  'b1288' => 'Chobot Leśniczówka',
-# 'b254'  => 'Cholerzyn (nż)', # nowa nazwa # 'b3298' => 'Cholerzyn Skwer (nż)',
-  'b3056' => 'Cholerzyn Granica (nż)',
-  'b253'  => 'Cholerzyn Sklep (nż)',
-  'b252'  => 'Cholerzyn Skrzyżowanie (nż)',
-  'b3298' => 'Cholerzyn Skwer (nż)',
-  'b3055' => 'Cholerzyn Zagórze (nż)',
-  'b2878' => 'Chopina',
-# 'b886'  => 'Chorowice', # nowa nazwa # 'b3324' => 'Chorowice Pętla',
-  'b3324' => 'Chorowice Pętla',
-  'b230'  => 'Chrosna Kapliczka (nż)',
-  'b2911' => 'Chrosna Pętla',
-  'b229'  => 'Chrosna Sklep (nż)',
-  'b228'  => 'Chrosna Studnia (nż)',
-  'b87'   => 'Cichy Kącik',
-  'b2653' => 'Ciekowiec (nż)',
-  'b3037' => 'Cienista',
-  'b36'   => 'Clepardia',
-  'b897'  => 'Cmentarz Batowice',
-  'b2699' => 'Cmentarz Batowice Wschód (nż)',
-  'b3137' => 'Cmentarz Bielany (nż)',
-  'b3126' => 'Cmentarz Bieżanów',
-  'b3139' => 'Cmentarz Borek Fałęcki (nż)',
-  'b3108' => 'Cmentarz Bronowice (nż)',
-  'b448'  => 'Cmentarz Grębałów',
-  'b2989' => 'Cmentarz Grębałów Południe (nż)',
-  'b3034' => 'Cmentarz Olszanica (nż)',
-  'b621'  => 'Cmentarz Podgórski',
-  'b2992' => 'Cmentarz Prokocim', # nieczynny - remont ul. Bieżanowskiej
-  'b124'  => 'Cmentarz Rakowicki',
-  'b2531' => 'Cmentarz Rakowicki Zachód (nż)',
-  'b3120' => 'Cmentarz Ruszcza (nż)',
-  'b3133' => 'Cmentarz Wróblowice',
-  'b822'  => 'Conrada',
-  'b2500' => 'Cracovia Błonia',
-  'b2501' => 'Cracovia Stadion',
-  'b129'  => 'Cystersów',
-  'b975'  => 'Czajowice (nż)',
-  'b1159' => 'Czarnochowice I (nż)',
-  'b81'   => 'Czarnowiejska',
-  'b1226' => 'Czernichów Bór (nż)',
-# 'b1204' => 'Czernichów GS (nż)', # nowa nazwa # 'b3402' => 'Czernichów Studzienki (nż)',
-# 'b3224' => 'Czernichów Pętla', # nowa nazwa # 'b3394' => 'Czernichów Rynek',
-  'b2892' => 'Czernichów Ratanice (nż)',
-  'b2891' => 'Czernichów Ratanice Most (nż)',
-  'b3394' => 'Czernichów Rynek',
-  'b1203' => 'Czernichów Stacja Paliw (nż)',
-  'b3402' => 'Czernichów Studzienki (nż)',
-  'b2890' => 'Czernichów Zakamycze (nż)',
-  'b920'  => 'Czerwiakowskiego',
-  'b1063' => 'Czerwieńskiego',
-  'b3038' => 'Czerwone Maki P+R',
-# 'b878'  => 'Czulice', # nowa nazwa # 'b3283' => 'Czulice Kościół',
-# 'b496'  => 'Czulice I (nż)', # nowa nazwa # 'b3280' => 'Czulice Przymiarki (nż)',
-  'b3283' => 'Czulice Kościół',
-  'b3280' => 'Czulice Przymiarki (nż)',
-# 'b2881' => 'Czułów (nż)', # nowa nazwa # 'b3295' => 'Czułów Granica (nż)',
-# 'b2880' => 'Czułów Droga na Czułówek (nż)', # nowa nazwa # 'b3294' => 'Czułów Sklep (nż)',
-  'b3295' => 'Czułów Granica (nż)',
-  'b3294' => 'Czułów Sklep (nż)',
-  'b2879' => 'Czułów Szkoła',
-  'b1215' => 'Czułówek (nż)',
-  'b1365' => 'Czułówek Kapliczka',
-  'b407'  => 'Czyżyny',
-  'b965'  => 'Czyżyny Dworzec',
-  'b522'  => 'Cło',
-  'b392'  => 'DH Wanda',
-  'b3122' => 'Danalówka (nż)',
-  'b435'  => 'Darwina',
-  'b632'  => 'Dauna',
-  'b3113' => 'Dobrego Pasterza',
-  'b3370' => 'Dobry Początek (nż)', # tymczasowy - przebudowa ul. Wrobela
-  'b474'  => 'Dojazdów Działki (nż)',
-  'b475'  => 'Dojazdów PKS',
-# 'b686'  => 'Dom Spokojnej Starości', # nowa nazwa # 'b3384' => 'Miejskie Centrum Opieki',
-  'b646'  => 'Domagały (nż)',
-  'b3412' => 'Domagały Magazyny (nż)',
-  'b31'   => 'Dożynkowa',
-  'b216'  => 'Droga do Niegoszowic (nż)',
-  'b192'  => 'Droga do Rząski (nż)',
-  'b2614' => 'Drożdżowa',
-  'b518'  => 'Drożyska (nż)',
-  'b2590' => 'Drużbackiej',
-  'b2922' => 'Dubie Skrzyżowanie (nż)',
-  'b388'  => 'Dunikowskiego',
-  'b3125' => 'Duża Góra (nż)',
-  'b623'  => 'Dworcowa',
-  'b1060' => 'Dworzec Główny Wschód',
-  'b2608' => 'Dworzec Główny Zachód',
-  'b836'  => 'Dwór Czeczów',
-  'b2657' => 'Dymarek (nż)',
-  'b3193' => 'Dziekanowice Batowice SKA',
-  'b3165' => 'Dziekanowice Długa (nż)',
-  'b3166' => 'Dziekanowice Kapliczka',
-  'b3194' => 'Dziekanowicka (nż)',
-  'b370'  => 'Dąbie',
-  'b600'  => 'Dąbrowa',
-# 'b1202' => 'Dąbrowa Szlachecka (nż)', # nowa nazwa # 'b3401' => 'Wołowice Skrzyżowanie (nż)',
-  'b907'  => 'Dąbrowa Szlachecka Figurka (nż)',
-  'b1237' => 'Dąbrowa Szlachecka Krzemiennik',
-  'b910'  => 'Dąbrowa Szlachecka Krzyż (nż)',
-  'b3117' => 'Dąbrowskiej',
-  'b838'  => 'EC Łęg',
-  'b374'  => 'Elektrociepłownia Kraków',
-  'b464'  => 'Elektromontaż (nż)',
-  'b3116' => 'Fatimska (nż)',
-  'b322'  => 'Filharmonia',
-  'b1375' => 'Fiszera',
-  'b2566' => 'Fort Bodzów (nż)',
-  'b1051' => 'Fort Mogiła (nż)',
-  'b2587' => 'Fort Swoszowice (nż)',
-  'b1371' => 'Fort Winnica (nż)',
-  'b754'  => 'Forteczna',
-  'b367'  => 'Francesco Nullo',
-  'b617'  => 'Fredry',
-  'b2615' => 'Gaik (nż)',
-  'b2856' => 'Gaj Kwiatowa (nż)',
-  'b2857' => 'Gaj Rudawa (nż)',
-  'b790'  => 'Gaj Szkoła',
-  'b791'  => 'Gaj Zadziele',
-  'b2858' => 'Gaj Zgody (nż)',
-# 'b174'  => 'Garlica Duchowna (nż)', # nowa nazwa # 'b3344' => 'Garlica Duchowna Kapliczka (nż)',
-# 'b2957' => 'Garlica Duchowna Droga do Garliczki', # nowa nazwa # 'b2628' => 'Garlica Duchowna Rozjazd',
-  'b3344' => 'Garlica Duchowna Kapliczka (nż)',
-  'b2628' => 'Garlica Duchowna Rozjazd',
-# 'b175'  => 'Garlica Murowana', # nowa nazwa # 'b3345' => 'Garlica Murowana Plac Zabaw',
-  'b2770' => 'Garlica Murowana Kasztany (nż)',
-  'b3345' => 'Garlica Murowana Plac Zabaw',
-# 'b2958' => 'Garlica Murowana Podskale (nż)', # nowa nazwa # 'b3358' => 'Zielonki Jaskinia Zielonkowska (nż)',
-  'b2629' => 'Garliczka Chochół (nż)',
-  'b2588' => 'Geologów (nż)',
-  'b1172' => 'Giebułtów',
-  'b1177' => 'Giebułtów Morgi',
-  'b1176' => 'Giebułtów Plac Zabaw (nż)',
-  'b2877' => 'Giebułtów Trojadyn (nż)',
-  'b2876' => 'Giebułtów Trojadyn Trafo (nż)',
-  'b1352' => 'Giebułtów Zbiornik (nż)',
-  'b3174' => 'Giedroycia (nż)',
-  'b3178' => 'Giedroycia ZTPO (nż)',
-  'b2766' => 'Giełda Balicka P+R (nż)',
-  'b276'  => 'Glinnik (nż)',
-  'b2751' => 'Glogera (nż)',
-  'b2752' => 'Glogera Granica Miasta (nż)',
-  'b2993' => 'Gnieźnieńska (nż)',
-  'b2909' => 'Godlewskiego',
-  'b3059' => 'Golkowice Kościół',
-  'b3146' => 'Golkowice Pętla',
-  'b3144' => 'Golkowice Sklep',
-  'b22'   => 'Gospodarska',
-# 'b2760' => 'Goszcza', # nowa nazwa # 'b3289' => 'Goszcza Dworek',
-  'b2763' => 'Goszcza Cmentarz (nż)',
-  'b3289' => 'Goszcza Dworek',
-# 'b955'  => 'Goszyce (nż)', # nowa nazwa # 'b3291' => 'Goszyce Pod Lasem (nż)',
-  'b3291' => 'Goszyce Pod Lasem (nż)',
-  'b954'  => 'Goszyce Remiza (nż)',
-  'b1090' => 'Gołuchowice',
-  'b1091' => 'Gołuchowice Jurczyce',
-  'b1092' => 'Gołuchowice Sklep (nż)',
-# 'b2493' => 'Grabie', # nowa nazwa # 'b3333' => 'Grabie Pętla',
-  'b1293' => 'Grabie Dom Kultury (nż)',
-  'b1295' => 'Grabie Kościół',
-  'b2492' => 'Grabie Kuźnia (nż)',
-  'b1094' => 'Grabie Polanka (nż)',
-  'b3333' => 'Grabie Pętla',
-  'b1292' => 'Grabie Szczurów (nż)',
-  'b3339' => 'Grabowa',
-  'b3145' => 'Grabówki Pętla',
-  'b560'  => 'Gromadzka',
-  'b2687' => 'Grota-Roweckiego',
-  'b76'   => 'Grottgera',
-  'b3186' => 'Grzegorza z Sanoka (nż)',
-  'b443'  => 'Grębałów (nż)',
-  'b2974' => 'Grębynice (nż)',
-  'b1150' => 'Grębynice Mogiełki (nż)',
-  'b2973' => 'Grębynice OSP (nż)',
-  'b455'  => 'Gwarecka (nż)',
-  'b749'  => 'Góra Borkowska (nż)',
-  'b35'   => 'Górka Narodowa',
-  'b2797' => 'Górka Narodowa Wschód',
-  'b2567' => 'Górka Pychowicka (nż)',
-# 'b170'  => 'Górna Wieś', # nowa nazwa # 'b3342' => 'Górna Wieś Pętla',
-  'b3342' => 'Górna Wieś Pętla',
-  'b1049' => 'Głowackiego',
-# 'b876'  => 'Głęboka', # nowa nazwa # 'b3281' => 'Głęboka Staw',
-  'b2996' => 'Głęboka Kolonia (nż)',
-  'b3281' => 'Głęboka Staw',
-  'b3046' => 'Głęboka Zakręt (nż)',
-  'b552'  => 'Habina (nż)',
-  'b2991' => 'Hala Sportowa Piaski Wielkie (nż)',
-  'b363'  => 'Hala Targowa',
-  'b2583' => 'Hallera (nż)',
-  'b741'  => 'Halszki',
-  'b2642' => 'Hektary (nż)',
-  'b931'  => 'Herberta (nż)',
-  'b315'  => 'Hofmana',
-  'b3157' => 'Husarska (nż)', # nieczynny - przebudowa ul. Wrobela
-  'b510'  => 'Igołomska (nż)',
-  'b38'   => 'Imbramowska',
-# 'b685'  => 'Instytut Pediatrii', # nowa nazwa # 'b3383' => 'Szpital Uniwersytecki / Instytut Pediatrii',
-  'b317'  => 'Instytut Reumatologii',
-  'b840'  => 'Isep (nż)',
-# 'b933'  => 'Iwanowice', # nowa nazwa # 'b3353' => 'Iwanowice Dworskie Pętla',
-  'b3353' => 'Iwanowice Dworskie Pętla',
-# 'b3243' => 'Jadwigi z Łobzowa', # tymczasowy - przebudowa linii do Bronowic
-  'b2626' => 'Jana Kazimierza',
-  'b1062' => 'Janasówka (nż)',
-  'b185'  => 'Januszowice',
-  'b506'  => 'Janówka (nż)',
-  'b668'  => 'Jasieńskiego (nż)',
-  'b832'  => 'Jasnogórska (nż)',
-  'b1110' => 'Jaśkowice (nż)',
-  'b1111' => 'Jaśkowice PKP (nż)',
-  'b2586' => 'Jerzmanowskiego',
-  'b3228' => 'Jeziorzany Górskie Domy (nż)',
-  'b2904' => 'Jeziorzany Pętla',
-  'b2903' => 'Jeziorzany Rondo (nż)',
-  'b655'  => 'Jeżowa',
-  'b2617' => 'Jordanowska (nż)',
-  'b319'  => 'Jubilat',
-  'b758'  => 'Judyma',
-  'b2792' => 'Judyma Szkoła',
-  'b742'  => 'Jugowicka',
-  'b3190' => 'Jurczaka (nż)',
-  'b2488' => 'Jurczyce Dom Ludowy',
-  'b2490' => 'Jurczyce Podole (nż)',
-  'b2489' => 'Jurczyce Szkoła (nż)',
-  'b3234' => 'Jędrzejczyka (nż)',
-  'b624'  => 'Kabel',
-# 'b1222' => 'Kamień Dół (nż)', # nowa nazwa # 'b3404' => 'Kamień Remiza (nż)',
-  'b3404' => 'Kamień Remiza (nż)',
-  'b3279' => 'Kamień Szkoła',
-  'b620'  => 'Kamieńskiego',
-  'b619'  => 'Kamieńskiego Wiadukt (nż)',
-  'b2690' => 'Kampus UJ',
-  'b445'  => 'Kantorowice',
-  'b576'  => 'Kapelanka',
-  'b3206' => 'Karniowice Górki (nż)',
-  'b3205' => 'Karniowice Pętla',
-# 'b877'  => 'Karniów', # nowa nazwa # 'b3282' => 'Karniów Szkoła',
-  'b3282' => 'Karniów Szkoła',
-  'b546'  => 'Karowa (nż)',
-  'b717'  => 'Karpińskiego',
-  'b147'  => 'Kasztanowa',
-  'b283'  => 'Kaszów',
-  'b282'  => 'Kaszów II (nż)',
-  'b3303' => 'Kaszów Szkoła nr 2 (nż)',
-  'b284'  => 'Kaszów Tyrałówka (nż)',
-  'b3304' => 'Kaszów Wielka Droga (nż)',
-  'b2886' => 'Kaszów Wyźrał (nż)',
-  'b285'  => 'Kaszów Łysa Góra (nż)',
-  'b13'   => 'Katowicka',
-  'b82'   => 'Kawiory',
-  'b945'  => 'Kenara (nż)',
-  'b427'  => 'Klasztor Cystersów',
-  'b429'  => 'Klasztorna',
-  'b382'  => 'Kleeberga',
-# 'b1054' => 'Kleszczów', # nowa nazwa # 'b3423' => 'Kleszczów Centrum',
-  'b3423' => 'Kleszczów Centrum',
-  'b2864' => 'Kleszczów Pod Lipką (nż)',
-  'b946'  => 'Klimeckiego',
-  'b935'  => 'Kliny Zacisze',
-  'b768'  => 'Kobierzyn',
-  'b584'  => 'Kobierzyńska',
-  'b3207' => 'Kobylany Dworska (nż)',
-  'b3204' => 'Kobylany Kwiatowa',
-  'b1065' => 'Kobylany Remiza (nż)',
-  'b215'  => 'Kochanów',
-  'b214'  => 'Kochanów I (nż)',
-# 'b3042' => 'Kocmyrzów', # nowa nazwa # 'b3292' => 'Kocmyrzów-Luborzyca Urząd Gminy',
-  'b3001' => 'Kocmyrzów Biblioteka',
-  'b1257' => 'Kocmyrzów Krzyżówka (nż)',
-  'b3000' => 'Kocmyrzów Rondo',
-  'b3005' => 'Kocmyrzów Sodfiny (nż)',
-  'b3292' => 'Kocmyrzów-Luborzyca Urząd Gminy',
-  'b1158' => 'Kokotów I (nż)',
-  'b1162' => 'Kokotów II (nż)',
-  'b457'  => 'Koksochemia (nż)',
-  'b2563' => 'Kolna (nż)',
-  'b459'  => 'Kombinat',
-  'b313'  => 'Komorowskiego',
-  'b830'  => 'Komuny Paryskiej',
-# 'b799'  => 'Konary', # nowa nazwa # 'b3364' => 'Konary Pętla',
-  'b3312' => 'Konary Królowej Polski (nż)',
-  'b3052' => 'Konary Pod Sosenką (nż)',
-  'b3364' => 'Konary Pętla',
-  'b1347' => 'Konary Sęk (nż)',
-# 'b805'  => 'Konary Włosań (nż)', # nowa nazwa # 'b3312' => 'Konary Królowej Polski (nż)',
-  'b326'  => 'Konopnickiej',
-  'b148'  => 'Kopalina (nż)',
-  'b2932' => 'Kopanka Druga (nż)',
-  'b2484' => 'Kopanka Kapliczka (nż)',
-  'b2813' => 'Kopanka Kościół (nż)',
-  'b3451' => 'Kopanka Ofiar Katynia',
-  'b2931' => 'Kopanka Pętla',
-  'b2485' => 'Kopanka Szkoła',
-  'b242'  => 'Kopiec Kościuszki',
-  'b571'  => 'Korona',
-  'b2970' => 'Korzkiew Botoja (nż)',
-  'b2971' => 'Korzkiew Zamek (nż)',
-  'b156'  => 'Kosmowskiej (nż)',
-  'b706'  => 'Kosocice',
-  'b2585' => 'Kosocicka (nż)',
-  'b601'  => 'Kostrze',
-  'b597'  => 'Kostrze Kapliczka (nż)',
-  'b599'  => 'Kostrze OSP',
-  'b605'  => 'Kostrze Szkoła',
-  'b2559' => 'Koszykarska',
-  'b3063' => 'Kozienicka',
-# 'b342'  => 'Kozierów Skrzyżowanie (nż)', # nowa nazwa # 'b3348' => 'Narama Graniczna Sklep (nż)',
-  'b1139' => 'Kończyce',
-  'b2644' => 'Kościelniki',
-  'b2861' => 'Kraków Airport',
-# 'b2975' => 'Krasieniec Pod Lipą', # nowa nazwa # 'b3359' => 'Krasieniec Zakupny Pod Lipą',
-# 'b346'  => 'Krasieniec Remiza (nż)', # nowa nazwa # 'b3352' => 'Krasieniec Zakupny Remiza (nż)',
-# 'b345'  => 'Krasieniec Stary (nż)', # nowa nazwa # 'b3351' => 'Krasieniec Stary Kopalina (nż)',
-  'b3351' => 'Krasieniec Stary Kopalina (nż)',
-  'b3350' => 'Krasieniec Stary Skrzyżowanie (nż)',
-# 'b934'  => 'Krasieniec Zakupny', # nowa nazwa # 'b3354' => 'Krasieniec Zakupny Kapliczka',
-  'b3354' => 'Krasieniec Zakupny Kapliczka',
-  'b3359' => 'Krasieniec Zakupny Pod Lipą',
-  'b3352' => 'Krasieniec Zakupny Remiza (nż)',
-  'b998'  => 'Krasnowolskiego (nż)',
-  'b62'   => 'Krowoderskich Zuchów',
-  'b63'   => 'Krowodrza Górka',
-  'b2601' => 'Krowodrza Urzędy Skarbowe',
-  'b381'  => 'Kruszwicka',
-  'b258'  => 'Kryspinów',
-  'b257'  => 'Kryspinów Sanka (nż)',
-# 'b2895' => 'Kryspinów Stopień Wodny (nż)', # nowa nazwa # 'b3371' => 'Kryspinów Stopień Wodny (nż)',
-  'b3371' => 'Kryspinów Stopień Wodny (nż)',
-  'b702'  => 'Krzemieniecka (nż)',
-  'b3250' => 'Krzeszowice Dworzec Autobusowy',
-  'b2923' => 'Krzeszowice Krakowska Muzeum (nż)',
-  'b1044' => 'Krzeszowice Witaminka (nż)',
-  'b3134' => 'Krzesławice Młyn (nż)',
-  'b1192' => 'Krzyszkowice Kasztanowa I (nż)',
-  'b1193' => 'Krzyszkowice Kasztanowa II (nż)',
-  'b1191' => 'Krzyszkowice Kościół (nż)',
-  'b2817' => 'Krzyszkowice Krzyszkowicka',
-  'b1194' => 'Krzyszkowice Modrzewiowa (nż)',
-  'b2740' => 'Krzyszkowice Os.Szymanowskiego (nż)',
-  'b1195' => 'Krzyszkowice Różana (nż)',
-  'b1248' => 'Krzysztoforzyce Góra (nż)',
-  'b3230' => 'Krzysztoforzyce Pętla',
-  'b3043' => 'Krzysztoforzyce Sklep (nż)',
-  'b1256' => 'Krzysztoforzyce przy Dworze (nż)',
-  'b1169' => 'Krzęcin Cmentarz (nż)',
-# 'b1357' => 'Krzęcin Częsna (nż)', # nowa nazwa # 'b3332' => 'Krzęcin Szczęsna (nż)',
-  'b1098' => 'Krzęcin Kapliczka (nż)',
-  'b1096' => 'Krzęcin Kościół',
-  'b2928' => 'Krzęcin Pętla',
-  'b1095' => 'Krzęcin Sklep',
-  'b3332' => 'Krzęcin Szczęsna (nż)',
-  'b1099' => 'Krzęcin Szkoła',
-# 'b150'  => 'Królowej Jadwigi', # nowa nazwa # 'b3339' => 'Grabowa',
-  'b2739' => 'Ks.Targosza (nż)',
-  'b675'  => 'Ks.Łaczka (nż)',
-# 'b1140' => 'Książniczki Boisko (nż)', # nowa nazwa # 'b3377' => 'Książniczki Paszczykówka (nż)',
-  'b1142' => 'Książniczki Centrum',
-  'b1143' => 'Książniczki Las (nż)',
-  'b3377' => 'Książniczki Paszczykówka (nż)',
-  'b544'  => 'Kujawy',
-  'b567'  => 'Kuklińskiego',
-  'b884'  => 'Kulerzów (nż)',
-  'b885'  => 'Kulerzów Wąwóz (nż)',
-  'b387'  => 'Kupały',
-  'b3176' => 'Kurdwanów P+R',
-  'b709'  => 'Kurdwanów Szkoła',
-  'b3136' => 'Kurzei',
-  'b98'   => 'Kuźnicy Kołłątajowskiej',
-  'b527'  => 'Kąkolowa (nż)',
-  'b759'  => 'Kąpielowa (nż)',
-  'b3180' => 'Kępa (nż)',
-# 'b1220' => 'Kłokoczyn (nż)', # nowa nazwa # 'b3306' => 'Kłokoczyn Szkoła (nż)',
-  'b3309' => 'Kłokoczyn Machaczki (nż)',
-  'b3306' => 'Kłokoczyn Szkoła (nż)',
-  'b3074' => 'Kłuszyńska',
-  'b140'  => 'Lajkonika (nż)',
-  'b694'  => 'Landaua',
-  'b750'  => 'Las Borkowski',
-  'b2557' => 'Lasek Mogilski',
-  'b2790' => 'Lasek Łęgowski (nż)',
-# 'b337'  => 'Laskowiec (nż)', # nowa nazwa # 'b3346' => 'Michałowice Laskowiec (nż)',
-  'b3217' => 'Lednica Górna (nż)',
-  'b3216' => 'Lednica Górna Chorągwica (nż)',
-  'b65'   => 'Lekarska',
-  'b554'  => 'Lesisko',
-  'b3363' => 'Leszczynowa (nż)',
-  'b2619' => 'Leszka Białego',
-  'b157'  => 'Leśmiana',
-  'b3071' => 'Libertowska (nż)',
-  'b2706' => 'Libertów',
-  'b2638' => 'Libertów Dolny (nż)',
-  'b2925' => 'Libertów Droga do Sidziny (nż)',
-  'b2711' => 'Libertów Działy (nż)',
-  'b2710' => 'Libertów Krzyżówka',
-  'b2707' => 'Libertów Szkoła',
-  'b2772' => 'Libertów Zgodna (nż)',
-  'b3373' => 'Libertów Świetlista',
-  'b2524' => 'Lindego (nż)',
-  'b2686' => 'Lipińskiego',
-  'b837'  => 'Lipowskiego (nż)',
-  'b561'  => 'Lipska',
-  'b289'  => 'Liszki I (nż)',
-  'b286'  => 'Liszki Krzyżówka',
-  'b2899' => 'Liszki Tyniecka (nż)',
-  'b287'  => 'Liszki UG',
-  'b2887' => 'Liszki Wołowska Droga (nż)',
-  'b126'  => 'Lubicz',
-  'b94'   => 'Lublańska',
-  'b468'  => 'Lubocza Bugaj (nż)',
-  'b467'  => 'Lubocza PKP (nż)',
-  'b469'  => 'Lubocza Przychodnia',
-  'b470'  => 'Lubocza Szkoła',
-  'b471'  => 'Lubocza Trafo (nż)',
-  'b472'  => 'Luborzyca',
-  'b3002' => 'Luborzyca Szkoła',
-  'b937'  => 'Lubostroń (nż)',
-  'b2808' => 'Ludwinów',
-# 'b2905' => 'Lusina (nż)', # nowa nazwa # 'b3326' => 'Lusina Krakowska (nż)',
-  'b2936' => 'Lusina Dobrzyczany (nż)',
-  'b722'  => 'Lusina Dolna (nż)',
-  'b1003' => 'Lusina Dwór',
-# 'b2637' => 'Lusina Granica', # nowa nazwa # 'b3373' => 'Libertów Świetlista',
-  'b801'  => 'Lusina Górka (nż)',
-  'b3326' => 'Lusina Krakowska (nż)',
-  'b3301' => 'Lusina Krakówka (nż)',
-# 'b3184' => 'Lusina Krakówkaa (nż)', # błąd # 'b3301' => 'Lusina Krakówka (nż)',
-  'b2937' => 'Lusina Kraśnik (nż)',
-  'b1000' => 'Lusina Pętla',
-  'b1002' => 'Lusina Spacerowa',
-  'b1001' => 'Lusina Szkoła',
-  'b2938' => 'Lusina Zagrody (nż)',
-  'b2935' => 'Lusina Zielona',
-  'b1196' => 'Lusina Łany (nż)',
-  'b930'  => 'M1 Al. Pokoju',
-  'b2736' => 'M1 Nowohucka',
-  'b1269' => 'Maciejowice Góra (nż)',
-  'b3159' => 'Maciejowice Pętla',
-  'b3168' => 'Maciejowice Skrzyżowanie (nż)',
-  'b37'   => 'Mackiewicza',
-  'b3123' => 'Magazynowa (nż)',
-  'b96'   => 'Majora',
-  'b626'  => 'Makowa',
-  'b56'   => 'Makowskiego',
-  'b2542' => 'Makuszyńskiego (nż)',
-  'b625'  => 'Malborska',
-  'b880'  => 'Malborska Szkoła',
-  'b310'  => 'Malczewskiego (nż)',
-  'b2589' => 'Malinowskiego (nż)',
-  'b1130' => 'Marchołta',
-  'b3004' => 'Marszowice (nż)',
-  'b3003' => 'Marszowice Centrum (nż)',
-  'b1319' => 'Marszowice Góry (nż)',
-  'b2983' => 'Maszyce (nż)',
-  'b1174' => 'Maszyce Remiza (nż)',
-  'b1152' => 'Maszyce Skrzyżowanie (nż)',
-# 'b2982' => 'Masłomiąca (nż)', # nowa nazwa # 'b3378' => 'Masłomiąca Długa (nż)',
-  'b3378' => 'Masłomiąca Długa (nż)',
-  'b3374' => 'Masłomiąca Koźlica (nż)',
-  'b2981' => 'Masłomiąca Staw (nż)',
-  'b90'   => 'Mazowiecka',
-  'b941'  => 'Mała Góra (nż)',
-  'b2496' => 'Mała Wieś (nż)',
-# 'b1263' => 'Mały Płaszów', # nowa nazwa # 'b3310' => 'Mały Płaszów P+R',
-  'b3310' => 'Mały Płaszów P+R',
-  'b406'  => 'Medweckiego',
-  'b3109' => 'Mehoffera',
-  'b995'  => 'Meissnera',
-  'b3130' => 'Merkuriusza Polskiego',
-  'b85'   => 'Miasteczko Studenckie AGH',
-  'b331'  => 'Michałowice (nż)',
-  'b1058' => 'Michałowice Banasiówka (nż)',
-  'b2967' => 'Michałowice Brzozowa (nż)',
-  'b2963' => 'Michałowice Gościniec (nż)',
-  'b2964' => 'Michałowice Górna (nż)',
-  'b333'  => 'Michałowice I',
-  'b336'  => 'Michałowice II (nż)',
-  'b3355' => 'Michałowice Jana Pawła II (nż)',
-  'b332'  => 'Michałowice Komora (nż)',
-# 'b905'  => 'Michałowice Koźlica (nż)', # nowa nazwa # 'b3374' => 'Masłomiąca Koźlica (nż)',
-  'b2506' => 'Michałowice Kwiaty Polne (nż)',
-  'b3356' => 'Michałowice Las Michałowski',
-# 'b2507' => 'Michałowice Las Michałowski (nż)', # nowa nazwa # 'b3355' => 'Michałowice Jana Pawła II (nż)',
-  'b3346' => 'Michałowice Laskowiec (nż)',
-  'b335'  => 'Michałowice Lecznica (nż)',
-  'b2965' => 'Michałowice Michałówka (nż)',
-  'b1145' => 'Michałowice Ogrodowa (nż)',
-  'b2729' => 'Michałowice Ośrodek Zdrowia',
-  'b1055' => 'Michałowice Ujęcie Wody (nż)',
-  'b3347' => 'Michałowice Warszawka (nż)',
-  'b104'  => 'Miechowity',
-  'b3384' => 'Miejskie Centrum Opieki',
-  'b362'  => 'Miodowa',
-  'b375'  => 'Mistrzejowice',
-  'b2538' => 'Miśnieńska',
-# 'b2882' => 'Mników Droga do Kaszowa (nż)', # nowa nazwa # 'b3297' => 'Mników Sklep (nż)',
-  'b3232' => 'Mników Granica (nż)',
-  'b2714' => 'Mników Pańska Góra (nż)',
-  'b3296' => 'Mników Remiza (nż)',
-  'b2715' => 'Mników Skały',
-# 'b248'  => 'Mników Sklep (nż)', # nowa nazwa # 'b3296' => 'Mników Remiza (nż)',
-  'b3297' => 'Mników Sklep (nż)',
-  'b3104' => 'Mników Zarynnie (nż)',
-  'b2516' => 'Mobilis',
-  'b2694' => 'Mochnaniec (nż)',
-  'b986'  => 'Modlnica',
-  'b968'  => 'Modlnica I Kolonia (nż)',
-  'b969'  => 'Modlnica II (nż)',
-  'b985'  => 'Modlnica Skrzyżowanie (nż)',
-  'b2875' => 'Modlnica Trojadyn Szydło (nż)',
-  'b984'  => 'Modlniczka',
-  'b983'  => 'Modlniczka I (nż)',
-  'b3251' => 'Modlniczka Leroy Merlin (nż)',
-  'b197'  => 'Modlniczka Mała',
-  'b1353' => 'Modlniczka Poligon (nż)',
-  'b1046' => 'Modlniczka Trzcie (nż)',
-  'b2499' => 'Mogilany Cicha (nż)',
-  'b888'  => 'Mogilany Cmentarz (nż)',
-  'b2953' => 'Mogilany Kopce (nż)',
-  'b3313' => 'Mogilany Krótka (nż)',
-  'b793'  => 'Mogilany Ośrodek Zdrowia (nż)',
-  'b792'  => 'Mogilany Rynek',
-  'b794'  => 'Mogilany Wiadukt (nż)',
-# 'b806'  => 'Mogilany Włosań (nż)', # nowa nazwa # 'b3313' => 'Mogilany Krótka (nż)',
-# 'b233'  => 'Morawica', # nowa nazwa # 'b3386' => 'Morawica Centrum',
-  'b3386' => 'Morawica Centrum',
-# 'b234'  => 'Morawica Cmentarz (nż)', # nowa nazwa # 'b3387' => 'Morawica Szkoła (nż)',
-  'b232'  => 'Morawica Krzyżówka',
-  'b231'  => 'Morawica Mostek (nż)',
-  'b3105' => 'Morawica Rudki (nż)',
-  'b3387' => 'Morawica Szkoła (nż)',
-  'b3119' => 'Morcinka (nż)',
-  'b1239' => 'Most Kotlarski (nż)',
-  'b565'  => 'Motyla',
-  'b460'  => 'Mrozowa (nż)',
-  'b974'  => 'Murownia (nż)',
-  'b3060' => 'Murownia Pętla',
-  'b1015' => 'Muzeum Armii Krajowej (nż)',
-  'b3141' => 'Muzeum Narodowe',
-  'b8'    => 'Mydlniki',
-  'b2525' => 'Mydlniki Granica Miasta (nż)',
-  'b9'    => 'Mydlniki Stawy (nż)',
-  'b740'  => 'Myślenicka (nż)',
-# 'b3262' => 'Młodej Polski (nż)', # tymczasowy - przebudowa linii do Bronowic
-  'b1144' => 'Młodziejowice Młyn (nż)',
-  'b1141' => 'Młodziejowice Park',
-  'b636'  => 'Młodzieży (nż)', # nieczynny - przebudowa ul. Bieżanowskiej
-  'b1040' => 'Młynka (nż)',
-  'b218'  => 'Młynka I (nż)',
-  'b1'    => 'Młynka Pętla',
-  'b2908' => 'Młynówka SKA (nż)',
-  'b2616' => 'Na Budzyniu',
-  'b273'  => 'Na Krępaku (nż)',
-  'b550'  => 'Na Załęczu',
-# 'b549'  => 'Na Załęczu Szkoła (nż)', # nowa nazwa # 'b3337' => 'Archiwum UMK (nż)',
-  'b645'  => 'Nad Drwiną',
-  'b2541' => 'Nad Dłubnią',
-  'b2656' => 'Nadbrzezie (nż)',
-  'b3348' => 'Narama Graniczna Sklep (nż)',
-  'b3349' => 'Narama Księża (nż)',
-  'b2966' => 'Narama Remiza',
-  'b121'  => 'Narzymskiego',
-  'b2606' => 'Natansona',
-  'b1042' => 'Nawojowa Góra I (nż)',
-  'b1043' => 'Nawojowa Góra II (nż)',
-  'b2775' => 'Nałkowskiej',
-  'b2594' => 'Niebieska Autostrada (nż)',
-  'b3278' => 'Niebyła (nż)',
-  'b1327' => 'Niedźwiedź Felix (nż)',
-  'b1326' => 'Niedźwiedź PKP (nż)',
-# 'b1187' => 'Nielepice', # nowa nazwa # 'b3424' => 'Nielepice Pętla',
-  'b3424' => 'Nielepice Pętla',
-  'b1235' => 'Nielepice Stadnina (nż)',
-  'b1278' => 'Niepołomice Batorego (nż)',
-  'b1279' => 'Niepołomice Batorego II (nż)',
-  'b1306' => 'Niepołomice Boryczów (nż)',
-  'b1300' => 'Niepołomice Diesla (nż)',
-  'b1276' => 'Niepołomice Dworzec',
-  'b1289' => 'Niepołomice Jazy (nż)',
-  'b1290' => 'Niepołomice Jazy II (nż)',
-  'b964'  => 'Niepołomice Kolejowa (nż)',
-  'b1303' => 'Niepołomice Kościuszki (nż)',
-  'b1298' => 'Niepołomice Kątek (nż)',
-# 'b1275' => 'Niepołomice Moczydło (nż)', # nowa nazwa # 'b1276' => 'Niepołomice Dworzec',
-  'b1297' => 'Niepołomice Pasternik (nż)',
-  'b1296' => 'Niepołomice Podgrabie (nż)',
-  'b1299' => 'Niepołomice Poręby (nż)',
-  'b1302' => 'Niepołomice Płaszowska I (nż)',
-  'b1277' => 'Niepołomice Rynek',
-  'b1307' => 'Niepołomice Wielicka (nż)',
-  'b1301' => 'Niepołomice Wodna (nż)',
-  'b2688' => 'Norymberska',
-# 'b280'  => 'Nowa Wieś (nż)', # nowa nazwa # 'b3392' => 'Nowa Wieś Szlachecka Sklep (nż)',
-# 'b1197' => 'Nowa Wieś Jesionka (nż)', # nowa nazwa # 'b3398' => 'Nowa Wieś Szlachecka Jesionka (nż)',
-# 'b281'  => 'Nowa Wieś Kapliczka (nż)', # nowa nazwa # 'b3393' => 'Nowa Wieś Szlachecka Kapliczka (nż)',
-# 'b279'  => 'Nowa Wieś Kościół (nż)', # nowa nazwa # 'b3391' => 'Nowa Wieś Szlachecka Kościół (nż)',
-# 'b278'  => 'Nowa Wieś Szlachecka', # nowa nazwa # 'b3390' => 'Nowa Wieś Szlachecka Pętla',
-  'b3398' => 'Nowa Wieś Szlachecka Jesionka (nż)',
-  'b3393' => 'Nowa Wieś Szlachecka Kapliczka (nż)',
-  'b3391' => 'Nowa Wieś Szlachecka Kościół (nż)',
-  'b3390' => 'Nowa Wieś Szlachecka Pętla',
-  'b3392' => 'Nowa Wieś Szlachecka Sklep (nż)',
-  'b395'  => 'Nowolipki (nż)',
-  'b715'  => 'Nowosądecka',
-  'b3175' => 'Nowy Bieżanów P+R',
-  'b2581' => 'Nowy Bieżanów Południe',
-  'b71'   => 'Nowy Kleparz',
-  'b2582' => 'Nowy Prokocim',
-  'b3068' => 'Obserwatorium (nż)',
-  'b1313' => 'Ochmanów Oknoplast (nż)',
-  'b2727' => 'Ochmanów Otaczarnia (nż)',
-# 'b1171' => 'Ochodza', # nowa nazwa # 'b3331' => 'Ochodza Dwór',
-  'b1329' => 'Ochodza Dom Ludowy (nż)',
-  'b3331' => 'Ochodza Dwór',
-  'b1331' => 'Ochodza Odwiśle',
-  'b1330' => 'Ochodza Staw (nż)',
-  'b2951' => 'Ochojno Dąbrówki',
-  'b863'  => 'Ochojno Kamieniec',
-  'b861'  => 'Ochojno Remiza',
-  'b860'  => 'Ochojno Skrzyżowanie',
-  'b2655' => 'Oczyszczalnia Ścieków \'Kujawy\' (nż)',
-  'b553'  => 'Odmętowa',
-  'b369'  => 'Ofiar Dąbia',
-  'b18'   => 'Ojcowska',
-  'b16'   => 'Ojcowska Dworek',
-  'b17'   => 'Ojcowska Wągroda',
-  'b103'  => 'Olsza II',
-  'b161'  => 'Olszanica Bory',
-  'b158'  => 'Olszanica Kapliczka (nż)',
-  'b2534' => 'Olszanica Ogródki Działkowe (nż)',
-  'b102'  => 'Olszecka',
-  'b761'  => 'Opatkowice',
-  'b760'  => 'Opatkowice Wiadukt (nż)',
-  'b2634' => 'Opatkowice Zadworze',
-  'b92'   => 'Opolska Estakada',
-  'b48'   => 'Opolska Kładka',
-  'b431'  => 'Orkana',
-  'b3064' => 'Orszy-Broniewskiego',
-# 'b361'  => 'Orzeszkowej', # tymczasowy - przebudowa ul. Krakowskiej
-  'b3187' => 'Orłowskiego (nż)',
-  'b3114' => 'Os. Akademickie PK',
-  'b111'  => 'Os. Dywizjonu 303',
-  'b421'  => 'Os. Górali',
-  'b402'  => 'Os. Jagiellońskie',
-  'b386'  => 'Os. Kalinowe',
-  'b756'  => 'Os. Kliny',
-  'b413'  => 'Os. Kolorowe',
-  'b3445' => 'Os. Kościuszkowskie',
-  'b710'  => 'Os. Kurdwanów',
-  'b28'   => 'Os. Marszowiec',
-  'b2737' => 'Os. Mistrzejowice Nowe',
-  'b391'  => 'Os. Na Lotnisku',
-  'b424'  => 'Os. Na Skarpie',
-  'b939'  => 'Os. Na Stoku',
-  'b436'  => 'Os. Na Stoku Szkoła',
-  'b108'  => 'Os. Oświecenia',
-  'b378'  => 'Os. Piastów',
-  'b2812' => 'Os. Podwawelskie',
-  'b582'  => 'Os. Robotnicze',
-  'b390'  => 'Os. Strusia',
-  'b428'  => 'Os. Wandy',
-  'b430'  => 'Os. Willowe',
-  'b418'  => 'Os. Zgody',
-  'b422'  => 'Os. Zielone',
-  'b377'  => 'Os. Złotego Wieku',
-# 'b404'  => 'Os.Kościuszkowskie', # nowa nazwa # 'b3445' => 'Os. Kościuszkowskie',
-  'b1243' => 'Os. Łokietka', # poprawione # 'b1243' => 'Os.Łokietka',
-  'b2643' => 'Ostafina',
-  'b2969' => 'Owczary (nż)',
-# 'b2631' => 'Owczary Długa (nż)', # nowa nazwa # 'b3357' => 'Owczary Spacerowa (nż)',
-  'b2632' => 'Owczary Gajowa (nż)',
-  'b2630' => 'Owczary Górna (nż)',
-  'b2968' => 'Owczary Pętla',
-  'b3357' => 'Owczary Spacerowa (nż)',
-  'b817'  => 'PB',
-  'b3135' => 'PCK',
-  'b819'  => 'PP',
-  'b818'  => 'PW',
-  'b2526' => 'Pachońskiego',
-  'b963'  => 'Panieńskich Skał',
-  'b2560' => 'Park \'Skały Twardowskiego\' (nż)',
-  'b143'  => 'Park Decjusza',
-  'b1004' => 'Park Wodny',
-  'b3149' => 'Park Zdrojowy',
-  'b15'   => 'Pasternik (nż)',
-  'b2776' => 'Petrażyckiego (nż)',
-  'b3070' => 'Petrażyckiego Osiedle (nż)',
-  'b3191' => 'Petőfiego (nż)',
-  'b716'  => 'Piaski Nowe',
-  'b687'  => 'Piaski Wielkie',
-  'b3177' => 'Piaskowa (nż)',
-  'b379'  => 'Piasta Kołodzieja',
-  'b2529' => 'Piaszczysta',
-# 'b270'  => 'Piekary', # nowa nazwa # 'b3389' => 'Piekary Centrum',
-  'b2898' => 'Piekary Borki (nż)',
-  'b3389' => 'Piekary Centrum',
-  'b2900' => 'Piekary Dół (nż)',
-  'b868'  => 'Piekary Górne',
-  'b2897' => 'Piekary Korea (nż)',
-  'b2896' => 'Piekary Na Brzegu (nż)',
-  'b1189' => 'Piekary Pałac (nż)',
-  'b269'  => 'Piekary Sklep (nż)',
-# 'b2985' => 'Pielgrzymowice (nż)', # nowa nazwa # 'b3379' => 'Pielgrzymowice Wierzbowa (nż)',
-  'b2986' => 'Pielgrzymowice Granica (nż)',
-  'b2984' => 'Pielgrzymowice Pętla',
-  'b3379' => 'Pielgrzymowice Wierzbowa (nż)',
-  'b3035' => 'Pielęgniarek',
-  'b119'  => 'Pilotów',
-# 'b1036' => 'Pisary (nż)', # nowa nazwa # 'b3420' => 'Pisary Spacerowa (nż)',
-  'b3421' => 'Pisary Akacjowa (nż)',
-  'b1236' => 'Pisary Dwór (nż)',
-  'b2860' => 'Pisary Kasztanowa (nż)',
-# 'b1037' => 'Pisary Kiosk (nż)', # nowa nazwa # 'b3421' => 'Pisary Akacjowa (nż)',
-# 'b1038' => 'Pisary Mleczarnia (nż)', # nowa nazwa # 'b3422' => 'Pisary Mleczna (nż)',
-  'b3422' => 'Pisary Mleczna (nż)',
-  'b1041' => 'Pisary Skrzyżowanie (nż)',
-  'b3420' => 'Pisary Spacerowa (nż)',
-# 'b3263' => 'Plac Axentowicza', # tymczasowy - przebudowa linii do Bronowic
-  'b570'  => 'Plac Bohaterów Getta',
-  'b2744' => 'Plac Centralny im. R.Reagana',
-  'b79'   => 'Plac Inwalidów',
-  'b360'  => 'Plac Wolnica', # nieczynny - przebudowa ul. Krakowskiej
-  'b1360' => 'Plac Wszystkich Świętych',
-  'b47'   => 'Pleszowska',
-  'b458'  => 'Pleszów',
-  'b357'  => 'Poczta Główna',
-  'b944'  => 'Pod Fortem',
-  'b1014' => 'Pod Lipą (nż)',
-  'b812'  => 'Podgaje',
-  'b603'  => 'Podgórki Tynieckie',
-  'b3158' => 'Podgórze SKA',
-  'b517'  => 'Podstawie (nż)',
-  'b644'  => 'Podwierzbie', # nieczynny - przebudowa ul. Wrobela
-  'b1311' => 'Podłęże Balachówka (nż)',
-  'b1309' => 'Podłęże Centrum (nż)',
-  'b2728' => 'Podłęże Przedszkole (nż)',
-  'b1310' => 'Podłęże Straż (nż)',
-  'b956'  => 'Polana Żywiecka (nż)',
-  'b1093' => 'Polanka Hallera Dwór',
-# 'b1318' => 'Polanowice (nż)', # nowa nazwa # 'b3288' => 'Polanowice Boisko (nż)',
-  'b3288' => 'Polanowice Boisko (nż)',
-  'b1323' => 'Polanowice Kolonia (nż)',
-  'b73'   => 'Politechnika',
-  'b380'  => 'Popielidów',
-  'b833'  => 'Poronińska (nż)',
-  'b97'   => 'Powstańców',
-  'b1155' => 'Powstańców Garaże',
-  'b3195' => 'Powstańców Magazyny',
-  'b2806' => 'Poziomkowa',
-  'b580'  => 'Praska (nż)',
-  'b3010' => 'Prawocheńskiego (nż)',
-  'b2746' => 'Prokocim Rynek',
-  'b682'  => 'Prokocim Szpital',
-  'b684'  => 'Prokocim UJ',
-  'b633'  => 'Prosta',
-# 'b479'  => 'Prussy', # błąd # 'b3300' => 'Prusy',
-  'b3300' => 'Prusy',
-  'b478'  => 'Prusy Szkoła (nż)',
-  'b477'  => 'Prusy WSR (nż)',
-  'b671'  => 'Pruszyńskiego',
-  'b3219' => 'Przebieczany',
-  'b1214' => 'Przeginia Duchowna (nż)',
-# 'b1228' => 'Przeginia Duchowna Bar (nż)', # nowa nazwa # 'b3407' => 'Przeginia Duchowna Kościół (nż)',
-# 'b1199' => 'Przeginia Duchowna Centrum', # nowa nazwa # 'b3399' => 'Przeginia Duchowna Remiza',
-  'b3407' => 'Przeginia Duchowna Kościół (nż)',
-  'b3399' => 'Przeginia Duchowna Remiza',
-  'b1198' => 'Przeginia Duchowna Szkoła (nż)',
-# 'b1227' => 'Przeginia Narodowa (nż)', # nowa nazwa # 'b3406' => 'Przeginia Narodowa Bunar (nż)',
-# 'b2906' => 'Przeginia Narodowa Bonar (nż)', # nowa nazwa # 'b3400' => 'Przeginia Narodowa Dwór (nż)',
-  'b3406' => 'Przeginia Narodowa Bunar (nż)',
-  'b3400' => 'Przeginia Narodowa Dwór (nż)',
-  'b316'  => 'Przegon',
-  'b275'  => 'Przegorzały',
-  'b3182' => 'Przegorzały Obwodnica (nż)',
-  'b641'  => 'Przewóz',
-  'b904'  => 'Przy Kuźni (nż)',
-  'b2530' => 'Przybyszewskiego',
-  'b190'  => 'Przybysławice I (nż)',
-  'b191'  => 'Przybysławice II',
-  'b1084' => 'Przybysławice III (nż)',
-  'b745'  => 'Przykopy (nż)',
-  'b532'  => 'Przylasek Rusiecki',
-  'b543'  => 'Przylasek Wyciąski (nż)',
-  'b2527' => 'Prądnik Biały',
-  'b870'  => 'Prądnik Biały Zachód',
-  'b100'  => 'Prądnik Czerwony',
-  'b1164' => 'Pszona',
-  'b1253' => 'Puszkarska',
-  'b2569' => 'Pychowice',
-  'b730'  => 'Pytlasińskiego',
-  'b3124' => 'Półłanki',
-  'b72'   => 'Pędzichów',
-  'b2703' => 'Pękowice',
-  'b2873' => 'Płaszowska',
-  'b564'  => 'Płaszów Szkoła',
-  'b660'  => 'Płk. Dąbka',
-  'b354'  => 'Raciborowice',
-  'b1138' => 'Raciborowice Centrum',
-  'b2988' => 'Raciborowice Granica (nż)',
-  'b154'  => 'Raczkiewicza (nż)',
-  'b1033' => 'Radwanowice I (nż)',
-  'b3208' => 'Radwanowice Krzeszowicka (nż)',
-  'b1032' => 'Radwanowice Pętla',
-  'b132'  => 'Radzikowskiego',
-  'b1376' => 'Radzikowskiego Osiedle',
-  'b788'  => 'Radziszów Centrum',
-  'b2774' => 'Radziszów Cmentarz (nż)',
-  'b789'  => 'Radziszów Kamionna (nż)',
-  'b1182' => 'Radziszów Kładka (nż)',
-  'b797'  => 'Radziszów Leśniczówka (nż)',
-  'b1186' => 'Radziszów PKP',
-  'b798'  => 'Radziszów Podlesie (nż)',
-  'b3233' => 'Radziszów Podlesie Las (nż)',
-  'b1184' => 'Radziszów Podwale (nż)',
-  'b2477' => 'Radziszów Stare Sanatorium (nż)',
-  'b3075' => 'Radziszów Szpital',
-  'b786'  => 'Radziszów Włosanka (nż)',
-  'b2491' => 'Radziszów Za Mogiłką (nż)',
-  'b1183' => 'Radziszów Zacisze (nż)',
-  'b787'  => 'Radziszów Zadworze (nż)',
-  'b1185' => 'Radziszów Zawodzie (nż)',
-  'b695'  => 'Rajsko',
-  'b1325' => 'Ratajów Skrzyżowanie (nż)',
-  'b3192' => 'Reduta (nż)',
-  'b502'  => 'Resztówka',
-  'b2568' => 'Rodzinna',
-  'b3041' => 'Rondo 308. Dywizjonu',
-  'b1066' => 'Rondo Barei',
-  'b408'  => 'Rondo Czyżyńskie',
-  'b3338' => 'Rondo Grunwaldzkie',
-  'b365'  => 'Rondo Grzegórzeckie',
-  'b2539' => 'Rondo Hipokratesa',
-  'b2745' => 'Rondo Kocmyrzowskie im. Ks. Gorzelanego',
-  'b610'  => 'Rondo Matecznego',
-  'b125'  => 'Rondo Mogilskie',
-  'b118'  => 'Rondo Młyńskie',
-  'b12'   => 'Rondo Ofiar Katynia',
-  'b383'  => 'Rondo Piastowskie',
-  'b2689' => 'Rostworowskiego',
-  'b589'  => 'Ruczaj',
-  'b217'  => 'Rudawa (nż)',
-# 'b1030' => 'Rudawa Bloki (nż)', # nowa nazwa # 'b3418' => 'Rudawa Osiedle (nż)',
-# 'b1031' => 'Rudawa Kościół', # nowa nazwa # 'b3419' => 'Rudawa Rynek',
-  'b1064' => 'Rudawa Młyn (nż)',
-  'b3418' => 'Rudawa Osiedle (nż)',
-  'b1059' => 'Rudawa PKP',
-  'b3419' => 'Rudawa Rynek',
-  'b2924' => 'Rudawa Stadion (nż)',
-  'b1039' => 'Rudawa Szkoła',
-# 'b2894' => 'Rusocice Droga do Kościoła (nż)', # nowa nazwa # 'b3308' => 'Rusocice Na Brzegu (nż)',
-  'b3405' => 'Rusocice Granica (nż)',
-  'b1260' => 'Rusocice Jałowce (nż)',
-  'b3308' => 'Rusocice Na Brzegu (nż)',
-  'b1229' => 'Rusocice Skład (nż)',
-# 'b2893' => 'Rusocice Stacja Benzynowa (nż)', # nowa nazwa # 'b3307' => 'Rusocice Stacja Paliw (nż)',
-# 'b3307' => 'Rusocice Stacja Paliw (nż)', # nowa nazwa # 'b3405' => 'Rusocice Granica (nż)',
-  'b1230' => 'Rusocice Wieś',
-  'b1261' => 'Rusocice Załęg (nż)',
-  'b1225' => 'Rusocice Łęg (nż)',
-  'b520'  => 'Ruszcza',
-  'b653'  => 'Rybitwy Dom Kultury',
-  'b652'  => 'Rybitwy Rozjazd (nż)',
-  'b654'  => 'Rybitwy Sklep (nż)',
-# 'b1209' => 'Rybna', # nowa nazwa # 'b3299' => 'Rybna Kościół',
-  'b1367' => 'Rybna Dolna',
-  'b3103' => 'Rybna Droga do Sanki (nż)', # powinno być # 'b3103' => 'Sanka Skrzyżowanie',
-  'b1213' => 'Rybna Dół (nż)',
-  'b1368' => 'Rybna Granica (nż)',
-  'b3299' => 'Rybna Kościół',
-  'b1208' => 'Rybna Nowy Świat',
-  'b2884' => 'Rybna Nowy Świat Góra (nż)',
-  'b1212' => 'Rybna Ośrodek Zdrowia (nż)',
-  'b2885' => 'Rybna Szkoła (nż)',
-  'b1341' => 'Rybna Zagórze (nż)',
-  'b579'  => 'Rynek Dębnicki',
-  'b616'  => 'Rynek Fałęcki',
-  'b1262' => 'Rzebika',
-  'b611'  => 'Rzemieślnicza',
-  'b3009' => 'Rzepakowa (nż)',
-  'b2654' => 'Rzepakowa Świetlica (nż)',
-  'b153'  => 'Rzepichy (nż)',
-# 'b855'  => 'Rzeszotary', # nowa nazwa # 'b3321' => 'Rzeszotary Dworska',
-  'b3321' => 'Rzeszotary Dworska',
-# 'b859'  => 'Rzeszotary Górne (nż)', # nowa nazwa # 'b3322' => 'Rzeszotary Remiza (nż)',
-  'b2940' => 'Rzeszotary Panciawa (nż)',
-  'b2939' => 'Rzeszotary Panciawa Pętla',
-  'b2778' => 'Rzeszotary Pod Dębiną (nż)',
-  'b858'  => 'Rzeszotary Polanki (nż)',
-  'b3322' => 'Rzeszotary Remiza (nż)',
-  'b857'  => 'Rzeszotary Szkoła (nż)',
-  'b2732' => 'Rzeszotary Tempo (nż)',
-  'b856'  => 'Rzeszotary Trafo (nż)',
-  'b842'  => 'Rzeszotary Zalesie (nż)',
-  'b1087' => 'Rzozów Baseny (nż)',
-  'b1088' => 'Rzozów I (nż)',
-  'b1180' => 'Rzozów PKP (nż)',
-  'b1179' => 'Rzozów Skotnica (nż)',
-  'b1089' => 'Rzozów Szkoła',
-  'b1181' => 'Rzozów Zagonnie (nż)',
-  'b196'  => 'Rząska Autostrada (nż)',
-  'b193'  => 'Rząska Jednostka Wojskowa (nż)',
-  'b3199' => 'Rząska Szkoła',
-  'b194'  => 'Rząska UR (nż)',
-  'b55'   => 'Różyckiego',
-# 'b3061' => 'Rączna Bażanty (nż)', # nowa nazwa # 'b3408' => 'Rączna Gołębiec (nż)',
-  'b3395' => 'Rączna Bażanty (nż)',
-  'b2902' => 'Rączna Boisko (nż)',
-  'b1217' => 'Rączna Dzikowiec (nż)',
-  'b3408' => 'Rączna Gołębiec (nż)',
-  'b296'  => 'Rączna Kapliczka (nż)',
-  'b1370' => 'Rączna Kościół (nż)',
-# 'b2901' => 'Rączna OSP (nż)', # nowa nazwa # 'b3396' => 'Rączna Remiza (nż)',
-  'b306'  => 'Rączna Osiedle (nż)',
-  'b1216' => 'Rączna Podlas (nż)',
-  'b3396' => 'Rączna Remiza (nż)',
-  'b3044' => 'Rżąka',
-# 'b2762' => 'Sadowie (nż)', # nowa nazwa # 'b3290' => 'Sadowie Wiadukt (nż)',
-  'b3290' => 'Sadowie Wiadukt (nż)',
-  'b311'  => 'Salwator',
-  'b3152' => 'Sapalskiego (nż)',
-  'b559'  => 'Saska',
-  'b3128' => 'Sawiczewskich',
-# 'b3261' => 'Sewera (nż)', # tymczasowy - przebudowa linii do Bronowic
-  'b772'  => 'Sidzina',
-  'b943'  => 'Sieborowice (nż)',
-  'b542'  => 'Siejówka (nż)',
-  'b142'  => 'Sielanka',
-  'b2547' => 'Sieroszewskiego (nż)',
-  'b32'   => 'Siewna',
-  'b33'   => 'Siewna Wiadukt',
-  'b1166' => 'Sikorki',
-  'b2556' => 'Siwka (nż)',
-  'b264'  => 'Skalna (nż)',
-  'b2731' => 'Skarżyńskiego',
-  'b779'  => 'Skawina',
-  'b1133' => 'Skawina 29 Listopada',
-  'b2473' => 'Skawina Ajka',
-  'b2854' => 'Skawina Bukowska (nż)',
-  'b2863' => 'Skawina Centrum Sportowe',
-  'b2475' => 'Skawina Cmentarz',
-  'b1137' => 'Skawina Cmentarz Komunalny',
-  'b1104' => 'Skawina Elektrownia (nż)',
-  'b2487' => 'Skawina Energetyków (nż)',
-  'b3008' => 'Skawina Energetyków Przejazd PKP (nż)',
-  'b2853' => 'Skawina Graniczna (nż)',
-  'b1086' => 'Skawina Koncentraty',
-  'b2930' => 'Skawina Kopernika (nż)',
-  'b1101' => 'Skawina Korabnicka (nż)',
-  'b1102' => 'Skawina Korabnicka Szkoła (nż)',
-  'b2481' => 'Skawina Korabniki',
-  'b2494' => 'Skawina Nad Potokiem (nż)',
-# 'b2868' => 'Skawina Ofiar Katynia', # nowa nazwa # 'b3451' => 'Kopanka Ofiar Katynia',
-  'b2929' => 'Skawina Ogrody (nż)',
-  'b2471' => 'Skawina Os.Radziszowskie (nż)',
-  'b3336' => 'Skawina Piastowska (nż)',
-  'b2867' => 'Skawina Pileckiego',
-  'b1103' => 'Skawina Piłsudskiego',
-  'b1107' => 'Skawina Podbory (nż)',
-  'b3327' => 'Skawina Podgórki',
-# 'b2927' => 'Skawina Podgórki Skawińskie', # nowa nazwa # 'b3327' => 'Skawina Podgórki',
-  'b2476' => 'Skawina Podlipki',
-  'b2474' => 'Skawina Popiełuszki',
-  'b2472' => 'Skawina Radziszowska (nż)',
-  'b2486' => 'Skawina Robotnicza',
-  'b781'  => 'Skawina Rynek',
-  'b785'  => 'Skawina Rzepnik',
-  'b3441' => 'Skawina SCK',
-  'b2480' => 'Skawina Samborek Most',
-  'b1134' => 'Skawina Starostwo Powiatowe',
-  'b1007' => 'Skawina Szkoła',
-  'b1008' => 'Skawina Sąd',
-  'b2479' => 'Skawina Tyniecka',
-  'b2478' => 'Skawina Tyniecka Osiedle',
-  'b3173' => 'Skawina Tyniecka Rzepnik (nż)',
-  'b1011' => 'Skawina Wojska Polskiego',
-  'b1100' => 'Skawina Wyspiańskiego',
-  'b2820' => 'Skawina Wyspiańskiego Szkoła (nż)',
-  'b1105' => 'Skawina Zachodnia (nż)',
-  'b3334' => 'Skawina Żwirowa (nż)',
-  'b3335' => 'Skawina Żwirownia (nż)',
-  'b219'  => 'Skała Kmity (nż)',
-  'b766'  => 'Skotniki',
-  'b3181' => 'Skotniki Kościół',
-  'b604'  => 'Skotniki Szkoła',
-  'b752'  => 'Skośna',
-  'b42'   => 'Skrajna (nż)',
-# 'b953'  => 'Skrzeszowice', # nowa nazwa # 'b3286' => 'Skrzeszowice OSP Boisko',
-  'b3286' => 'Skrzeszowice OSP Boisko',
-  'b967'  => 'Skrzyżowanie do Podchruścia (nż)',
-  'b1153' => 'Smardzowice',
-  'b2972' => 'Smardzowice Wołówka (nż)',
-  'b816'  => 'Smoleńskiego',
-  'b572'  => 'Smolki',
-  'b699'  => 'Soboniowice',
-  'b746'  => 'Solvay',
-  'b2544' => 'Sołtysowska (nż)',
-  'b2546' => 'Sołtysowska Osiedle',
-  'b2545' => 'Sołtysowska Zakłady',
-  'b116'  => 'Spadochroniarzy',
-  'b3276' => 'Spławy',
-  'b57'   => 'Stachiewicza',
-  'b1308' => 'Staniątki Wiadukt (nż)',
-  'b144'  => 'Stara Wola',
-  'b2558' => 'Stare Wiślisko',
-  'b358'  => 'Starowiślna',
-  'b3032' => 'Stary Kleparz',
-  'b2791' => 'Stawowa',
-  'b112'  => 'Stella-Sawickiego',
-  'b558'  => 'Stoczniowców',
-  'b711'  => 'Stojałowskiego',
-  'b359'  => 'Stradom',
-  'b423'  => 'Struga',
-  'b2874' => 'Strycharska',
-  'b101'  => 'Strzelców',
-  'b141'  => 'Strzelnica',
-  'b618'  => 'Sucha',
-  'b666'  => 'Sucharskiego (nż)',
-  'b456'  => 'Suchy Jar (nż)',
-  'b2602' => 'Sudolska',
-  'b476'  => 'Sulechów (nż)',
-  'b2570' => 'Surzyckiego',
-  'b2571' => 'Sułkowskiego',
-  'b2497' => 'Sułków (nż)',
-  'b739'  => 'Swoszowice Autostrada (nż)',
-  'b732'  => 'Swoszowice Poczta',
-  'b3129' => 'Swoszowice Szkoła',
-  'b869'  => 'Szafrańska',
-  'b562'  => 'Szczecińska',
-  'b2593' => 'Szczegów',
-  'b220'  => 'Szczyglice',
-  'b3045' => 'Szczyglice Autostrada',
-  'b871'  => 'Szczyglice Dom Kultury',
-  'b224'  => 'Szczyglice Most (nż)',
-  'b2910' => 'Szczyglice Podkamycze',
-  'b651'  => 'Szparagowa',
-  'b3203' => 'Szpital Jana Pawła II',
-  'b3036' => 'Szpital Narutowicza',
-  'b2759' => 'Szpital Okulistyczny',
-  'b827'  => 'Szpital Rydygiera',
-  'b3383' => 'Szpital Uniwersytecki / Instytut Pediatrii',  # poprawione # 'b3383' => 'Szpital Uniwersytecki / Instytut Pediatr',
-  'b425'  => 'Szpital Żeromskiego',
-  'b575'  => 'Szwedzka',
-  'b971'  => 'Szyce I (nż)',
-  'b970'  => 'Szyce II (nż)',
-  'b2646' => 'Szymańskiego (nż)',
-  'b628'  => 'Sławka (nż)',
-  'b2607' => 'Słomczyńskiego',
-  'b577'  => 'Słomiana',
-  'b2733' => 'Słomniki Kościuszki',
-  'b1315' => 'Słomniki Osiedle',
-  'b1316' => 'Słomniki Rynek',
-  'b1317' => 'Słomniki Zagłoby (nż)',
-  'b2584' => 'Słona Woda',
-  'b3138' => 'Słoneckiego',
-  'b314'  => 'Słonecznikowa',
-# 'b3293' => 'Słowiańska', # tymczasowy - przebudowa linii do Bronowic
-  'b2872' => 'TAURON Arena Kraków',
-  'b2871' => 'TAURON Arena Kraków Al. Pokoju (nż)',
-  'b3040' => 'TAURON Arena Kraków Wieczysta',
-  'b2724' => 'TR',
-  'b3172' => 'Taklińskiego (nż)',
-  'b77'   => 'Teatr Bagatela',
-  'b420'  => 'Teatr Ludowy',
-  'b3242' => 'Teatr Słowackiego',
-  'b681'  => 'Teligi',
-  'b919'  => 'Tischnera',
-  'b3218' => 'Tomaszkowice',
-  'b989'  => 'Tomaszowice',
-  'b2697' => 'Tomaszowice Gliniki (nż)',
-  'b988'  => 'Tomaszowice I (nż)',
-  'b3167' => 'Tomaszowice Kolberga (nż)',
-  'b987'  => 'Tomaszowice Wedonka (nż)',
-  'b139'  => 'Tondosa (nż)',
-  'b21'   => 'Tonie',
-  'b990'  => 'Tonie Gliniki (nż)',
-  'b25'   => 'Tonie Kąty (nż)',
-  'b23'   => 'Tonie Skrzyżowanie',
-  'b966'  => 'Tor Kajakowy',
-  'b936'  => 'Torfowa',
-  'b3450' => 'Tretówka', # tymczasowy - przebudowa ul. Wrony
-  'b994'  => 'Trojadyn Skrzyżowanie (nż)',
-  'b184'  => 'Trojanowice',
-  'b2977' => 'Trojanowice Krakowska (nż)',
-  'b178'  => 'Trojanowice Pętla',
-  'b183'  => 'Trojanowice Strugi (nż)',
-  'b2650' => 'Truskawkowa (nż)',
-# 'b2720' => 'Trzecia Góra (nż)', # nowa nazwa # 'b3341' => 'Węgrzce Trzecia Góra (nż)',
-  'b3222' => 'Trąbki I (nż)',
-  'b3223' => 'Trąbki OSP',
-  'b3245' => 'Trąbki P+R',
-  'b714'  => 'Tuchowska',
-  'b999'  => 'Turowicza (nż)',
-  'b593'  => 'Tyniec',
-  'b591'  => 'Tyniec Kamieniołom',
-  'b2562' => 'Tyniecka Autostrada (nż)',
-  'b3140' => 'UR Aleja 29 Listopada',
-  'b5'    => 'UR Balicka',
-  'b115'  => 'Ugorek',
-  'b1017' => 'Ujazd Pętla',
-  'b723'  => 'Ukraina (nż)',
-  'b127'  => 'Uniwersytet Ekonomiczny',
-  'b321'  => 'Uniwersytet Jagielloński',
-  'b88'   => 'Uniwersytet Pedagogiczny',
-  'b67'   => 'Urząd Marszałkowski',
-  'b957'  => 'Urząd Skarbowy Nowa Huta',
-  'b83'   => 'Urzędnicza',
-  'b486'  => 'Wadowska (nż)',
-  'b485'  => 'Wadów',
-  'b492'  => 'Wadów Działki (nż)',
-  'b2554' => 'Wadów Glinik (nż)',
-  'b2738' => 'Wadów Os.Kolejowe',
-  'b483'  => 'Wadów Osiedle (nż)',
-  'b484'  => 'Wadów Szkoła',
-  'b463'  => 'Walcownia',
-  'b2599' => 'Warchałowskiego',
-# 'b3264' => 'Warmijska', # tymczasowy - przebudowa linii do Bronowic
-  'b3131' => 'Warszewicza (nż)',
-# 'b338'  => 'Warszówka (nż)', # nowa nazwa # 'b3347' => 'Michałowice Warszawka (nż)',
-  'b2564' => 'Wały Wiślane (nż)',
-  'b2543' => 'Wańkowicza',
-  'b2639' => 'Ważewskiego',
-  'b2578' => 'Weigla',
-  'b133'  => 'Wesele',
-  'b434'  => 'Wiadukty (nż)',
-  'b3382' => 'Widłakowa (nż)',
-  'b2722' => 'Wielicka Granica Miasta',
-  'b3380' => 'Wieliczka Centrum',
-  'b898'  => 'Wieliczka Cmentarz',
-  'b3246' => 'Wieliczka Gdowska',
-  'b2852' => 'Wieliczka Goliana',
-# 'b2862' => 'Wieliczka Kampus', # nowa nazwa # 'b3429' => 'Wieliczka Miasto',
-  'b3430' => 'Wieliczka Klasztor',
-  'b2814' => 'Wieliczka Klaśnieńska (nż)',
-  'b1167' => 'Wieliczka Kopalnia Soli',
-# 'b911'  => 'Wieliczka Kościół', # nowa nazwa # 'b3430' => 'Wieliczka Klasztor'
-  'b3431' => 'Wieliczka Mediateka',
-  'b3429' => 'Wieliczka Miasto',
-  'b2730' => 'Wieliczka Niepołomska (nż)',
-  'b3006' => 'Wieliczka Os.Asnyka',
-  'b2503' => 'Wieliczka Park',
-  'b3247' => 'Wieliczka Polna (nż)',
-# 'b1168' => 'Wieliczka Rynek', # nowa nazwa # 'b3431' => 'Wieliczka Mediateka',
-  'b2816' => 'Wieliczka Solne Miasto',
-  'b3235' => 'Wieliczka Stacja Paliw',
-  'b2815' => 'Wieliczka Sąd',
-  'b972'  => 'Wielka Wieś (nż)',
-  'b1364' => 'Wielkie Drogi (nż)',
-  'b1232' => 'Wielkie Drogi Ośrodek Zdrowia (nż)',
-  'b1113' => 'Wielkie Drogi PKP (nż)',
-  'b1233' => 'Wielkie Drogi Szkoła (nż)',
-  'b1112' => 'Wielkie Drogi Trzebol (nż)',
-  'b866'  => 'Wiklinowa (nż)',
-  'b1267' => 'Wiktorowice Centrum (nż)',
-  'b1264' => 'Wiktorowice Granica (nż)',
-  'b3189' => 'Wiktorowice Rozlewnia Wód (nż)',
-  'b1266' => 'Wiktorowice Skrzyżowanie (nż)',
-  'b2515' => 'Wileńska',
-  'b737'  => 'Wilga (nż)',
-  'b1372' => 'Winnicka (nż)',
-  'b29'   => 'Witkowice',
-  'b30'   => 'Witkowice Nowe',
-  'b718'  => 'Witosa',
-# 'b1025' => 'Więckowice (nż)', # nowa nazwa # 'b3416' => 'Więckowice Ogrodowa (nż)',
-  'b2921' => 'Więckowice Lipka (nż)',
-  'b3416' => 'Więckowice Ogrodowa (nż)',
-# 'b348'  => 'Więcławice Stare (nż)', # nowa nazwa # 'b3372' => 'Więcławice Stare Centrum (nż)',
-  'b3372' => 'Więcławice Stare Centrum (nż)',
-  'b2987' => 'Więcławice Stare Wysyłek (nż)',
-  'b110'  => 'Wiślicka',
-  'b634'  => 'Wlotowa',
-  'b263'  => 'Wodociągi (nż)',
-  'b3115' => 'Wodociągowa (nż)',
-  'b1284' => 'Wola Batorska Borek (nż)',
-  'b1283' => 'Wola Batorska Cmentarz (nż)',
-  'b1282' => 'Wola Batorska Kościół (nż)',
-  'b1285' => 'Wola Batorska Mikoniowiec (nż)',
-  'b1280' => 'Wola Batorska Ruskie (nż)',
-  'b1286' => 'Wola Batorska Zamoglice (nż)',
-  'b1281' => 'Wola Batorska Żwirownia (nż)',
-  'b629'  => 'Wola Duchacka',
-# 'b949'  => 'Wola Luborzycka (nż)', # nowa nazwa # 'b3284' => 'Wola Luborzycka Skrzyżowanie (nż)',
-  'b1332' => 'Wola Luborzycka Działki (nż)',
-  'b950'  => 'Wola Luborzycka Las (nż)',
-  'b3284' => 'Wola Luborzycka Skrzyżowanie (nż)',
-# 'b1128' => 'Wola Radziszowska', # nowa nazwa # 'b3330' => 'Wola Radziszowska Pętla',
-  'b1127' => 'Wola Radziszowska Centrum',
-  'b1129' => 'Wola Radziszowska Chorzyny (nż)',
-# 'b3185' => 'Wola Radziszowska Kapelanka (nż)', # nowa nazwa # 'b3362' => 'Wola Radziszowska Kapelanka (nż)',
-  'b3362' => 'Wola Radziszowska Kapelanka (nż)',
-  'b1126' => 'Wola Radziszowska Lipki (nż)',
-  'b1124' => 'Wola Radziszowska Mała Ostra Góra (nż)',
-  'b1125' => 'Wola Radziszowska Most (nż)',
-  'b1336' => 'Wola Radziszowska Podgaźle (nż)',
-  'b3330' => 'Wola Radziszowska Pętla',
-# 'b1337' => 'Wola Radziszowska Łęg (nż)', # dawny
-  'b1291' => 'Wola Zabierzowska (nż)',
-# 'b172'  => 'Wola Zachariaszowska', # nowa nazwa # 'b3343' => 'Wola Zachariaszowska Szkoła',
-# 'b2702' => 'Wola Zachariaszowska Kresy', # nowa nazwa # 'b3356' => 'Michałowice Las Michałowski',
-  'b3343' => 'Wola Zachariaszowska Szkoła',
-  'b3360' => 'Wola Zachariaszowska Słoneczna',
-# 'b2976' => 'Wola Zachariaszowska Zakońce', # nowa nazwa # 'b3360' => 'Wola Zachariaszowska Słoneczna',
-  'b539'  => 'Wolica (nż)',
-  'b538'  => 'Wolica Kościół (nż)',
-  'b537'  => 'Wolica Las',
-  'b536'  => 'Wolica Most',
-# 'b540'  => 'Wolica Sklep (nż)', # nowa nazwa # 'b3427' => 'Wolica Szkoła (nż)',
-  'b3427' => 'Wolica Szkoła (nż)',
-# 'b894'  => 'Wołowice (nż)', # nowa nazwa # 'b3397' => 'Wołowice Remiza (nż)',
-  'b3231' => 'Wołowice Grotowa (nż)',
-  'b3227' => 'Wołowice Grotowa Skrzyżowanie (nż)',
-  'b909'  => 'Wołowice Kapliczka',
-# 'b1207' => 'Wołowice Niwa (nż)', # nowa nazwa # 'b3403' => 'Wołowice Niwka (nż)',
-  'b3403' => 'Wołowice Niwka (nż)',
-  'b2907' => 'Wołowice Pichonówka (nż)',
-  'b3397' => 'Wołowice Remiza (nż)',
-  'b1205' => 'Wołowice Sklep (nż)',
-  'b3401' => 'Wołowice Skrzyżowanie (nż)',
-  'b893'  => 'Wołowice Szkoła',
-  'b3229' => 'Wołowice Zawierzbie (nż)',
-  'b643'  => 'Wrobela', # nieczynny - przebudowa ul. Wrobela
-  'b68'   => 'Wrocławska',
-  'b2598' => 'Wrony',
-# 'b2948' => 'Wrząsowice (nż)', # nowa nazwa # 'b3319' => 'Wrząsowice Bonifraterska (nż)',
-  'b3426' => 'Wrząsowice Bonifraterska (nż)',
-# 'b3319' => 'Wrząsowice Bonifraterska  (nż)', # nowa nazwa # 'b3426' => 'Wrząsowice Bonifraterska (nż)',
-  'b2946' => 'Wrząsowice Centrum',
-  'b1234' => 'Wrząsowice Kowaleca (nż)',
-  'b2950' => 'Wrząsowice Nad Wilgą',
-  'b2947' => 'Wrząsowice Pileckiego (nż)',
-  'b2952' => 'Wrząsowice Pod Skałą (nż)',
-  'b3212' => 'Wrząsowice Rondo',
-  'b2945' => 'Wrząsowice Wrzosowa (nż)',
-  'b2944' => 'Wrząsowice Zielona (nż)',
-  'b3148' => 'Wróblowice',
-  'b729'  => 'Wróblowice Szkoła', # nieczynny - przebudowa ul. Myślenickiej
-  'b499'  => 'Wróżenice',
-  'b2641' => 'Wróżenice Górka (nż)',
-  'b2640' => 'Wróżenicka (nż)',
-  'b60'   => 'Wybickiego',
-  'b2647' => 'Wyciąska (nż)',
-  'b508'  => 'Wyciąże (nż)',
-  'b515'  => 'Wyciąże Sklep (nż)',
-  'b521'  => 'Wyciąże Wiadukt (nż)',
-  'b2645' => 'Wyciąże Zachód (nż)',
-  'b683'  => 'Wydział Farmaceutyczny UJ',
-  'b43'   => 'Wyki',
-  'b2998' => 'Wysiołek Luborzycki (nż)',
-  'b2999' => 'Wysiołek Luborzycki Kapkazy (nż)',
-  'b1320' => 'Wysiołek Luborzycki Radwany (nż)',
-  'b2997' => 'Wysiołek Luborzycki Skrzyżowanie (nż)',
-  'b1259' => 'Wysłouchów',
-# 'b292'  => 'Wyźrał Szkoła (nż)', # nowa nazwa # 'b3303' => 'Kaszów Szkoła nr 2 (nż)',
-# 'b293'  => 'Wyźrał Wielka Droga (nż)', # nowa nazwa # 'b3304' => 'Kaszów Wielka Droga (nż)',
-  'b442'  => 'Wzgórza Krzesławickie',
-  'b328'  => 'Węgrzce',
-  'b3442' => 'Węgrzce B1 (nż)',
-  'b3443' => 'Węgrzce B4 (nż)',
-# 'b2980' => 'Węgrzce Bosutów (nż)', # nowa nazwa # 'b3444' => 'Węgrzce Sudół (nż)',
-# 'b2979' => 'Węgrzce Bosutów Sudół (nż)', # nowa nazwa # 'b3443' => 'Węgrzce B4 (nż)',
-  'b1079' => 'Węgrzce Błonie',
-  'b165'  => 'Węgrzce Centrum',
-  'b1074' => 'Węgrzce Centrum Medyczne (nż)',
-  'b1073' => 'Węgrzce Magiczne Wzgórze (nż)',
-  'b1080' => 'Węgrzce Pętla',
-  'b327'  => 'Węgrzce Starostwo Powiatowe',
-  'b3444' => 'Węgrzce Sudół (nż)',
-  'b3341' => 'Węgrzce Trzecia Góra (nż)',
-  'b1163' => 'Węgrzce Wielkie II (nż)',
-  'b1161' => 'Węgrzce Wielkie III (nż)',
-  'b3270' => 'Węgrzce Wielkie Pętla',
-  'b487'  => 'Węgrzynowice',
-  'b488'  => 'Węgrzynowice Centrum (nż)',
-  'b2552' => 'Węgrzynowice Dół (nż)',
-  'b3277' => 'Węgrzynowicka (nż)',
-  'b3127' => 'Węzeł Wielicki (nż)',
-  'b3118' => 'Władysława Jagiełły',
-  'b3110' => 'Władysława Łokietka',
-# 'b807'  => 'Włosań', # nowa nazwa # 'b3314' => 'Włosań Centrum',
-  'b3314' => 'Włosań Centrum',
-  'b3053' => 'Włosań Dział Wschodni (nż)',
-  'b809'  => 'Włosań Kopań (nż)',
-  'b808'  => 'Włosań Krzyżówka (nż)',
-  'b146'  => 'ZOO',
-  'b2495' => 'Zabawa (nż)',
-  'b2510' => 'Zabawa I (nż)',
-  'b199'  => 'Zabierzów',
-  'b1287' => 'Zabierzów Bocheński Centrum (nż)',
-  'b198'  => 'Zabierzów Działki (nż)',
-  'b3248' => 'Zabierzów Eximius Park',
-  'b202'  => 'Zabierzów I',
-  'b961'  => 'Zabierzów Młyn',
-  'b213'  => 'Zabierzów Ośrodek Zdrowia',
-  'b204'  => 'Zabierzów PKP',
-  'b203'  => 'Zabierzów Piaski (nż)',
-  'b201'  => 'Zabierzów Piekarnia',
-  'b3249' => 'Zabierzów Rynek',
-  'b200'  => 'Zabierzów Sklep',
-  'b503'  => 'Zabłocie Kościelnickie (nż)',
-  'b590'  => 'Zachodnia',
-# 'b2888' => 'Zagacie (nż)', # nowa nazwa # 'b3305' => 'Zagacie Górka (nż)',
-  'b3305' => 'Zagacie Górka (nż)',
-  'b2889' => 'Zagacie Witkówki (nż)',
-# 'b916'  => 'Zagórzyce Dworskie', # nowa nazwa # 'b3375' => 'Zagórzyce Dworskie Remiza',
-  'b3375' => 'Zagórzyce Dworskie Remiza',
-# 'b917'  => 'Zagórzyce Stare (nż)', # nowa nazwa # 'b3376' => 'Zagórzyce Stare Owocowa (nż)',
-  'b3376' => 'Zagórzyce Stare Owocowa (nż)',
-  'b397'  => 'Zajezdnia Bieńczyce',
-  'b465'  => 'Zajezdnia Nowa Huta',
-  'b2576' => 'Zajezdnia Płaszów',
-  'b1254' => 'Zajezdnia Wola Duchacka',
-  'b155'  => 'Zakamycze',
-  'b3179' => 'Zakarnie (nż)',
-  'b7'    => 'Zakliki (nż)',
-  'b2789' => 'Zakole',
-  'b1305' => 'Zakrzów (nż)',
-  'b2649' => 'Zakępie (nż)',
-  'b511'  => 'Zakład Przeróbki (nż)',
-  'b137'  => 'Zarzecze',
-  'b274'  => 'Zaskale (nż)',
-  'b356'  => 'Zastów',
-  'b1265' => 'Zastów Działki (nż)',
-  'b839'  => 'Zatyka (nż)',
-  'b755'  => 'Zawiszy',
-  'b751'  => 'Zawiła (nż)',
-  'b721'  => 'Zbydniowice',
-  'b3147' => 'Zbydniowicka',
-  'b1116' => 'Zelczyna I (nż)',
-  'b1115' => 'Zelczyna Sklep',
-  'b1170' => 'Zelczyna Szkoła (nż)',
-  'b3200' => 'Zelków Kościuszki (nż)',
-  'b3198' => 'Zelków Pętla',
-  'b2918' => 'Zelków Spławy (nż)',
-  'b210'  => 'Zelków Staw',
-  'b209'  => 'Zelków Wola (nż)',
-  'b447'  => 'Zesławice',
-  'b2621' => 'Zesławice Ogródki Działkowe (nż)',
-  'b581'  => 'Zielińskiego (nż)',
-  'b2784' => 'Zielonki Galicyjska (nż)',
-  'b3358' => 'Zielonki Jaskinia Zielonkowska (nż)',
-  'b2978' => 'Zielonki Marszowiec Pętla',
-  'b177'  => 'Zielonki Rozjazd',
-  'b182'  => 'Zielonki Skrzyżowanie',
-  'b180'  => 'Zielonki Transformator',
-  'b181'  => 'Zielonki UG',
-  'b149'  => 'Zielony Dół',
-  'b2577' => 'Złocieniowa',
-  'b811'  => 'Złocień',
-  'b679'  => 'Ćwiklińskiej',
-  'b922'  => 'Łagiewniki',
-  'b563'  => 'Łanowa',
-  'b3069' => 'Łobzów SKA',
-# 'b951'  => 'Łososkowice', # nowa nazwa # 'b3285' => 'Łososkowice Remiza',
-  'b3285' => 'Łososkowice Remiza',
-  'b952'  => 'Łososkowice Szkoła (nż)',
-  'b480'  => 'Łuczanowice',
-  'b482'  => 'Łuczanowice Skrzyżowanie',
-  'b3066' => 'Łuczanowicka (nż)',
-# 'b1121' => 'Łuczyce', # nowa nazwa # 'b3287' => 'Łuczyce Kosynierów',
-  'b3287' => 'Łuczyce Kosynierów',
-  'b1120' => 'Łuczyce Las (nż)',
-  'b1231' => 'Łuczyce Zjawienie (nż)',
-  'b2761' => 'Łuczyce Zwierzyniec (nż)',
-  'b2604' => 'Łuczyńskiego (nż)',
-  'b120'  => 'Łukasiewicza',
-  'b640'  => 'Łutnia',
-  'b2596' => 'Łużycka (nż)',
-  'b384'  => 'Łęczycka',
-# 'b301'  => 'Ściejowice Granica (nż)', # nowa nazwa # 'b3395' => 'Rączna Bażanty (nż)',
-  'b3226' => 'Ściejowice Kościel (nż)',
-  'b1246' => 'Ściejowice Na Bagnach (nż)',
-  'b3225' => 'Ściejowice Remiza (nż)',
-  'b2610' => 'Ślaskiego (nż)',
-  'b1374' => 'Śliwiaka (nż)',
-  'b2517' => 'Śliwiaka Zakłady',
-  'b903'  => 'Ślósarczyka',
-  'b2742' => 'Św.Wawrzyńca',
-  'b2605' => 'Świdzińskiego (nż)',
-# 'b2942' => 'Świątniki Bielowicza Szkoła', # nowa nazwa # 'b3316' => 'Świątniki Górne Bielowicza Szkoła',
-# 'b2949' => 'Świątniki Buk (nż)', # nowa nazwa # 'b3320' => 'Świątniki Górne Buk (nż)',
-# 'b847'  => 'Świątniki Centrum', # nowa nazwa # 'b3317' => 'Świątniki Górne Centrum',
-  'b3316' => 'Świątniki Górne Bielowicza Szkoła',
-  'b3320' => 'Świątniki Górne Buk (nż)',
-  'b3317' => 'Świątniki Górne Centrum',
-  'b3325' => 'Świątniki Górne Krakowska (nż)',
-  'b3051' => 'Świątniki Górne Piasna Górka (nż)',
-  'b3315' => 'Świątniki Górne Skrzyżowanie (nż)',
-  'b3318' => 'Świątniki Górne Urząd Miasta i Gminy',
-# 'b2768' => 'Świątniki Krakowska (nż)', # nowa nazwa # 'b3325' => 'Świątniki Górne Krakowska (nż)',
-# 'b845'  => 'Świątniki Skrzyżowanie (nż)', # nowa nazwa # 'b3315' => 'Świątniki Górne Skrzyżowanie (nż)',
-# 'b2943' => 'Świątniki Urząd Miasta i Gminy', # nowa nazwa # 'b3318' => 'Świątniki Górne Urząd Miasta i Gminy',
-  'b2592' => 'Żelazowskiego (nż)',
-# 'b343'  => 'Żerkowice Kolonia (nż)', # nowa nazwa # 'b3349' => 'Narama Księża (nż)',
-# 'b344'  => 'Żerkowice Skrzyżowanie (nż)', # nowa nazwa # 'b3350' => 'Krasieniec Stary Skrzyżowanie (nż)',
-  'b417'  => 'Żeromskiego',
-  'b534'  => 'Żwirownia',
-  'b748'  => 'Żywiecka',
-  'b834'  => 'Żyzna (nż)',
-);

--
Gitblit v1.9.1